Подтвердить что ты не робот

Хранить только дату при использовании 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 спецификацию точности, чтобы я мог избавиться от временной части при работе с ежедневными данными?

4b9b3361

Ответ 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)])