Я использую 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
поддерживает ли спецификацию точности, чтобы я мог избавиться от временной части при работе с ежедневными данными?
Хотя я поддержал ответ EdChum, который является наиболее прямым ответом на вопрос, поставленный OP, на самом деле он не решает проблему производительности (он по-прежнему полагается на
datetime
объекты python , и, следовательно, любая операция с ними не будет векторизована, то есть будет медленно).Более эффективная альтернатива - использовать
df['dates'].dt.floor('d')
. Строго говоря, он не «сохраняет только часть даты», поскольку просто устанавливает время на00:00:00
. Но он работает так, как того требует OP, например, когда:groupby
... и это намного эффективнее, поскольку операция векторизована.
EDIT: на самом деле, ответ на ОП - х предпочли бы, вероятно , «последние версии
pandas
этого не пишут время в формате CSV , если это00:00:00
для всех наблюдений».источник
to_json
до сих пор пишет полный00:00:00
.date_format='iso'
?! По умолчанию он просто выводит секунды с начала эпохи.dt.normalize()
для серий из нескольких сотен элементов.Pandas v0.13 +: использовать
to_csv
сdate_format
параметромПо возможности избегайте преобразования вашей
datetime64[ns]
серии вobject
сериюdatetime.date
объектов dtype . Последний, часто создаваемый с использованиемpd.Series.dt.date
, хранится как массив указателей и неэффективен по сравнению с чистой серией на основе NumPy.Поскольку вас интересует формат при записи в CSV , просто используйте
date_format
параметрto_csv
. Например:df.to_csv(filename, date_format='%Y-%m-%d')
См .
strftime
Правила форматирования в директивах Python .источник
Pandas,
DatetimeIndex
и уSeries
вас есть метод,normalize
который делает именно то, что вы хотите.Вы можете прочитать об этом больше в этом ответе .
Его можно использовать как
ser.dt.normalize()
источник
Это простой способ извлечь дату:
import pandas as pd d='2015-01-08 22:44:09' date=pd.to_datetime(d).date() print(date)
источник
Просто даю более свежий ответ на случай, если кто-то увидит этот старый пост.
Добавление «utc = False» при преобразовании в datetime удалит компонент часового пояса и сохранит только дату в типе данных datetime64 [ns].
pd.to_datetime(df['Date'], utc=False)
Вы сможете сохранить его в Excel, не получая сообщения об ошибке «ValueError: Excel не поддерживает дату и время с часовыми поясами. Перед записью в Excel убедитесь, что для даты не указан часовой пояс».
источник
Преобразование в
datetime64[D]
:df.dates.values.astype('M8[D]')
Хотя переназначение этого столбцу DataFrame вернет его обратно к [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)])
источник
dt
этот фрагмент ответа перезапишет этот модуль! @ Дейл-Юнг, возможно, можно было бы сменить строку на что-то вроде dt_indexdf.loc[date]
метода, индекс возвращается кЯ хотел иметь возможность изменить тип набора столбцов во фрейме данных, а затем удалить время, сохраняющее день. round (), floor (), ceil () все работает
df[date_columns] = df[date_columns].apply(pd.to_datetime) df[date_columns] = df[date_columns].apply(lambda t: t.dt.floor('d'))
источник
Это сработало для меня с отметкой времени UTC (2020-08-19T09: 12: 57.945888)
for di, i in enumerate(df['YourColumnName']): df['YourColumnName'][di] = pd.Timestamp(i)
источник