In[31]: dfOut[31]:
a time012013-01-01122013-01-02232013-01-03In[32]: df['time']= df['time'].astype('datetime64[ns]')In[33]: dfOut[33]:
a time012013-01-0100:00:00122013-01-0200:00:00232013-01-0300:00:00
Хорошо - спасибо - как мне избавиться от 00:00:00 в конце каждого свидания?
user7289
1
Отметка времени панды имеет дату и время. Вы имеете в виду преобразовать его в объект даты Python?
waitkuo
7
Вы можете конвертировать егоdf['time'] = [time.date() for time in df['time']]
waitkuo
3
что означает [ns], можете ли вы сделать текстовую строку датой и удалить часть времени из этой даты?
yoshiserry
1
@yoshiserry - это наносекунды, и это способ хранения дат под капотом после правильного преобразования (время эпохи в наносекундах).
Энди Хайден
114
По сути эквивалент @waitingkuo, но я бы использовал to_datetimeздесь (он кажется немного чище и предлагает некоторые дополнительные функции, например dayfirst):
In[11]: dfOut[11]:
a time012013-01-01122013-01-02232013-01-03In[12]: pd.to_datetime(df['time'])Out[12]:02013-01-0100:00:0012013-01-0200:00:0022013-01-0300:00:00Name: time, dtype: datetime64[ns]In[13]: df['time']= pd.to_datetime(df['time'])In[14]: dfOut[14]:
a time012013-01-0100:00:00122013-01-0200:00:00232013-01-0300:00:00
Обработка ValueErrors
Если вы столкнетесь с ситуацией, когда
df['time']= pd.to_datetime(df['time'])
Бросает
ValueError:Unknown string format
Это означает, что у вас есть недопустимые (непринудительные) значения. Если вы согласны с их преобразованием в pd.NaT, вы можете добавить errors='coerce'аргумент в to_datetime:
Привет, ребята, @AndyHayden вы можете убрать часть времени из даты? Мне не нужна эта часть?
yoshiserry
В pandas 0.13.1 завершающие 00: 00: 00 не отображаются.
Энди Хайден
а как насчет других версий, как их убрать / и не отобразить?
yoshiserry
Я не думаю, что это можно сделать хорошим способом, обсуждается добавление date_format, например float_format (которое вы видели). Я все равно рекомендую обновиться.
Энди Хайден
Моя проблема в том, что моя дата находится в этом формате ... 41516.43, и я получаю эту ошибку. Я ожидал, что он вернет что-то вроде 2014-02-03 в новом столбце ?! ОШИБКА: # преобразовать значения дат в столбце "load_date" в даты budget_dataset ['date_last_load'] = pd.to_datetime (budget_dataset ['load_date']) budget_dataset -c: 2: SettingWithCopyWarning: Значение пытается быть установлено на копия фрагмента из DataFrame. Попробуйте вместо этого использовать .loc [row_index, col_indexer] = value
yoshiserry
36
Я предполагаю, что много данных поступает в Pandas из файлов CSV, и в этом случае вы можете просто преобразовать дату во время первоначального чтения CSV:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])где 0 относится к столбцу, в котором находится дата.
Вы также можете добавить , index_col=0туда, если хотите, чтобы дата была вашим индексом.
Обратите внимание, что для объектов datetime, если вы не видите час, когда они все 00:00:00, это не панды. Ноутбук iPython пытается сделать вещи красивыми.
У меня этот не работает, он жалуется: может использовать аксессор .dt только со значениями типа datetime
smishra
2
вам может потребоваться df[col] = pd.to_datetime(df[col])сначала преобразовать столбец в объекты даты и времени.
szeitlin
Проблема с этим ответом заключается в том, что он преобразует столбец, dtype = objectкоторый занимает значительно больше памяти, чем истинный datetime dtypeв pandas.
elPastor
6
Другой способ сделать это, и он хорошо работает, если у вас есть несколько столбцов для преобразования в datetime.
@MarkAndersen, поскольку у вас есть dateтолько значения в столбцах, преобразование в datetime сохранит только относящуюся к делу информацию. Если вы явно конвертируете с помощью df['datetime_col'].dt.date, это приведет к objectdtype; потеря в управлении памятью.
Сумант Лазарь,
6
Если вы хотите получить формат DATE, а не DATETIME:
Может случиться так, что даты необходимо преобразовать с другой частотой. В этом случае я бы предложил установить индекс по датам.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
После этого вы сможете более легко преобразовать дату в формат даты, который вам больше всего понадобится. Ниже я последовательно конвертирую в несколько форматов даты, в конечном итоге получая набор ежедневных дат в начале месяца.
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)#Convert to monthly dates
df.index = df.index.to_period(freq='M')#Convert to strings
df.index = df.index.strftime('%Y-%m')#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
Для краткости я не показываю, что запускаю следующий код после каждой строки выше:
Попробуйте преобразовать одну из строк в метку времени с помощью функции pd.to_datetime, а затем используйте .map для сопоставления формуляра со всем столбцом
Для полноты картины, другой вариант, который может быть не самым простым, немного похожий на тот, который предлагает @SSS, но с использованием библиотеки datetime:
df['time'] = [time.date() for time in df['time']]
По сути эквивалент @waitingkuo, но я бы использовал
to_datetime
здесь (он кажется немного чище и предлагает некоторые дополнительные функции, напримерdayfirst
):Обработка
ValueError
sЕсли вы столкнетесь с ситуацией, когда
Бросает
Это означает, что у вас есть недопустимые (непринудительные) значения. Если вы согласны с их преобразованием в
pd.NaT
, вы можете добавитьerrors='coerce'
аргумент вto_datetime
:источник
Я предполагаю, что много данных поступает в Pandas из файлов CSV, и в этом случае вы можете просто преобразовать дату во время первоначального чтения CSV:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
где 0 относится к столбцу, в котором находится дата.Вы также можете добавить
, index_col=0
туда, если хотите, чтобы дата была вашим индексом.См. Https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
источник
Теперь ты можешь сделать
df['column'].dt.date
Обратите внимание, что для объектов datetime, если вы не видите час, когда они все 00:00:00, это не панды. Ноутбук iPython пытается сделать вещи красивыми.
источник
df[col] = pd.to_datetime(df[col])
сначала преобразовать столбец в объекты даты и времени.dtype = object
который занимает значительно больше памяти, чем истинныйdatetime dtype
в pandas.Другой способ сделать это, и он хорошо работает, если у вас есть несколько столбцов для преобразования в datetime.
источник
date
только значения в столбцах, преобразование в datetime сохранит только относящуюся к делу информацию. Если вы явно конвертируете с помощьюdf['datetime_col'].dt.date
, это приведет кobject
dtype; потеря в управлении памятью.Если вы хотите получить формат DATE, а не DATETIME:
источник
Может случиться так, что даты необходимо преобразовать с другой частотой. В этом случае я бы предложил установить индекс по датам.
После этого вы сможете более легко преобразовать дату в формат даты, который вам больше всего понадобится. Ниже я последовательно конвертирую в несколько форматов даты, в конечном итоге получая набор ежедневных дат в начале месяца.
Для краткости я не показываю, что запускаю следующий код после каждой строки выше:
Это дает мне следующий результат:
источник
Попробуйте преобразовать одну из строк в метку времени с помощью функции pd.to_datetime, а затем используйте .map для сопоставления формуляра со всем столбцом
источник
источник
Для полноты картины, другой вариант, который может быть не самым простым, немного похожий на тот, который предлагает @SSS, но с использованием библиотеки datetime:
источник