Хранить только дату при использовании pandas.to_datetime
Я использую pandas.to_datetime
для анализа дат в моих данных. Pandas по умолчанию представляет даты с datetime64[ns]
, даже если даты доступны только ежедневно.
Интересно, есть ли элегантный/умный способ преобразования дат в datetime.date
или datetime64[D]
, так что, когда я пишу данные в CSV, даты не добавляются с помощью 00:00:00
. Я знаю, что я могу преобразовать тип вручную поэтапно:
[dt.to_datetime().date() for dt in df.dates]
Но это очень медленно, так как у меня много строк, и это своего рода поражение с целью использования pandas.to_datetime
. Есть ли способ конвертировать dtype
всего столбца сразу? Или, наоборот, поддерживает pandas.to_datetime
спецификацию точности, чтобы я мог избавиться от временной части при работе с ежедневными данными?
Ответы
Ответ 1
Начиная с версии 0.15.0
теперь это можно легко сделать, используя .dt
для доступа только к компоненту даты:
df['just_date'] = df['dates'].dt.date
Вышеприведенное возвращает datetime.date
dtime datetime.date
Если вы хотите использовать datetime64
вы можете просто normalize
компонент времени до полуночи, чтобы все значения были установлены на 00:00:00
:
df['normalised_date'] = df['dates'].dt.normalize()
Это сохраняет dtype как datetime64
но на дисплее отображается только значение date
.
Ответ 2
В то время как я одобрил ответ EdChum, который является самым прямым ответом на поставленный OP вопрос, он действительно не решает проблему производительности (он все еще полагается на объекты python datetime
, и, следовательно, любая операция на них не будет векторизованный - то есть он будет медленным).
Лучшая альтернатива - использовать df['dates'].dt.floor('d')
. Строго говоря, он не "сохраняет только дату", поскольку он просто устанавливает время на 00:00:00
. Но он работает по желанию OP, когда, например:
- печать на экран
- сохранение в csv
- используя столбец
groupby
... и это намного эффективнее, так как операция векторизована.
РЕДАКТИРОВАТЬ: на самом деле, ответ, который предпочли бы OP, вероятно, "последние версии pandas
не записывают время на csv, если оно 00:00:00
для всех наблюдений".
Ответ 3
У Pandas DatetimeIndex
и Series
есть метод под названием normalize
который делает именно то, что вы хотите.
Вы можете прочитать больше об этом в этом ответе.
Может использоваться как ser.dt.normalize()
Ответ 4
Простое решение:
df['date_only'] = df['date_time_column'].dt.date
Ответ 5
Это простой способ извлечь дату:
import pandas as pd
d='2015-01-08 22:44:09'
date=pd.to_datetime(d).date()
print(date)
Ответ 6
Панды v0. 13+: использовать to_csv
с параметром date_format
По возможности избегайте преобразования вашей серии datetime64[ns]
серию object
d типа объектов datetime.date
. Последний, часто pd.Series.dt.date
с использованием pd.Series.dt.date
, хранится в виде массива указателей и является неэффективным по сравнению с чисто серией на основе NumPy.
С вашей проблемой является формат при записи в CSV, просто использовать date_format
параметр to_csv
. Например:
df.to_csv(filename, date_format='%Y-%m-%d')
Смотрите Python strftime
директивы для форматирования соглашений.
Ответ 7
Преобразование в datetime64[D]
:
df.dates.values.astype('M8[D]')
Хотя повторное назначение этого в DataFrame col вернет его обратно в [ns].
Если вам нужен фактический datetime.date
:
dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])