Преобразование pandas.tslib.Timestamp в datetime python
У меня есть временные ряды df
. Я извлек индексы и хочу их преобразовать в datetime
. Как вы это делаете? Я пытался использовать pandas.to_datetime(x)
, но он не конвертирует его, когда я проверяю после использования type()
Ответы
Ответ 1
Просто попробуйте to_datetime()
>>> import pandas as pd
>>> t = pd.tslib.Timestamp('2016-03-03 00:00:00')
>>> type(t)
pandas.tslib.Timestamp
>>> t.to_datetime()
datetime.datetime(2016, 3, 3, 0, 0)
>>> t.to_pydatetime()
datetime.datetime(2016, 3, 3, 0, 0)
Измените на datetime.date
тип
>>> t.date()
datetime.date(2016, 3, 3)
Обновление
Спасибо, @mjp, to_datetime()
будет устаревать в будущем, вместо этого используйте to_pydatetime()
!
In [4]: t.to_datetime()
/Users/qiuwei/Library/Python/2.7/lib/python/site-packages/IPython/core/interactiveshell.py:2881: FutureWarning: to_datetime is deprecated. Use self.to_pydatetime()
exec(code_obj, self.user_global_ns, self.user_ns)
Out[4]: datetime.datetime(2016, 3, 3, 0, 0)
Ответ 2
Предполагая, что вы пытаетесь преобразовать объекты timestamp pandas, вы можете просто извлечь соответствующие данные из метки времени:
#Create the data
data = {1: tslib.Timestamp('2013-01-03 00:00:00', tz=None), 2: tslib.Timestamp('2013-01-04 00:00:00', tz=None), 3: tslib.Timestamp('2013-01-03 00:00:00', tz=None)}
#convert to df
df = pandas.DataFrame.from_dict(data, orient = 'index')
df.columns = ['timestamp']
#generate the datetime
df['datetime'] = df['timestamp'].apply(lambda x: datetime.date(x.year,x.month,x.day))
Конечно, если вам нужны секунды, минуты и часы, вы можете включить их как аргументы для функции datetime.datetime.
Ответ 3
У меня была такая же проблема, и я попробовал решение от @aikramer2, чтобы добавить столбец в мой df типа 'datetime.datetime', но снова я получил тип данных pandas:
#libraries used -
import pandas as pd
import datetime as dt
#loading data into a pandas df, from a local file. note column [1] contains a datetime column -
savedtweets = pd.read_csv('/Users/sharon/Documents/ipython/twitter_analysis/conftwit.csv', sep='\t',
names=['id', 'created_at_string', 'user.screen_name', 'text'],
parse_dates={"created_at" : [1]})
print int(max(savedtweets['id'])) #535073416026816512
print type(savedtweets['created_at'][0]) # result is <class 'pandas.tslib.Timestamp'>
# add a column specifically using datetime.datetime library -
savedtweets['datetime'] = savedtweets['created_at'].apply(lambda x: dt.datetime(x.year,x.month,x.day))
print type(savedtweets['datetime'][0]) # result is <class 'pandas.tslib.Timestamp'>
i подозреваемый pandas df не может хранить тип данных datetime.datetime. Я получил успех, когда создал простой список python для хранения значений datetime.datetime:
savedtweets = pd.read_csv('/Users/swragg/Documents/ipython/twitter_analysis/conftwit.csv', sep='\t',
names=['id', 'created_at_string', 'user.screen_name', 'text'],
parse_dates={"created_at" : [1]})
print int(max(savedtweets['id'])) #535073416026816512
print type(savedtweets['created_at'][0]) # <class 'pandas.tslib.Timestamp'>
savedtweets_datetime= [dt.datetime(x.year,x.month,x.day,x.hour,x.minute,x.second) for x in savedtweets['created_at']]
print savedtweets_datetime[0] # 2014-11-19 14:13:38
print savedtweets['created_at'][0] # 2014-11-19 14:13:38
print type(dt.datetime(2014,3,5,2,4)) # <type 'datetime.datetime'>
print type(savedtweets['created_at'][0].year) # <type 'int'>
print type(savedtweets_datetime) # <type 'list'>
Ответ 4
Просто обновление к вопросу, я попробовал наиболее одобренный ответ, и это дает мне это предупреждение
usr/local/lib/python3.5/dist-packages/IPython/core/interactiveshell.py: 2910: FutureWarning: to_datetime устарело. Используйте функцию self.to_pydatetime() exec (code_obj, self.user_global_ns, self.user_ns)
И предложите мне использовать to_pydatetime()
Например
sample = Timestamp('2018-05-02 10:08:54.774000')
sample.to_datetime()
вернет datetime.datetime(2018, 4, 30, 10, 8, 54, 774000)
Ответ 5
import time
time.strftime("%H:%M", time.strptime(str(x), "%Y-%m-%d %H:%M:%S"))
Примечание: x должен быть pandas.tslib.Timestamp(как в вопросе)
Ответ 6
Это работает для меня, чтобы создать дату для insert
в MySQL, попробуйте:
pandas_tslib = pandas_tslib.to_pydatetime()
pandas_tslib = "'" + pandas_tslib.strftime('%Y-%m-%d') + "'"
Ответ 7
Вы можете преобразовать Timestamp в объект datetime Python с помощью to_pydatetime(), но кажется, что при применении ко всему столбцу преобразование не выполняется:
>>> ts = pd.tslib.Timestamp.now()
>>> type(ts)
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
>>> type(ts.to_pydatetime())
<class 'datetime.datetime'>
>>> df = pd.DataFrame({"now": [datetime.datetime.utcnow()] * 10})
>>> type(df['now'].iloc[0])
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
>>> df['now2'] = df['now'].apply(lambda dt: dt.to_pydatetime())
>>> type(df['now2'].iloc[0])
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
Не уверен, что с этим делать. (В некоторых ситуациях объект Timestamp от Pandas не является идеальной заменой объекта Python datetime, и вам нужна настоящая вещь.)
Ответ 8
Как альтернативное решение, если у вас есть два отдельных поля (одно для даты; одно для времени):
Преобразовать в datetime.date
df['date2'] = pd.to_datetime(df['date']).apply(lambda x: x.date())
Преобразовать в datetime.time
df['time2'] = pd.to_datetime(df['time']).apply(lambda x: x.time())
После этого вы можете объединить их:
df['datetime'] = df.apply(lambda r : pd.datetime.combine(r['date2'],r['time2']),1)
Адаптировал этот пост
Ответ 9
В моем случае я не мог получить правильный вывод даже при указании формата: я всегда получал 1970 год.
На самом деле то, что решило мою проблему, заключалось в том, чтобы задать параметр unit
для функции, поскольку мои временные метки имеют детальность секунд:
df_new = df
df_new['time'] = pandas.to_datetime(df['time'], unit='s')