2013-04-23 2 views
43

Я использую pandas.to_datetime, чтобы разобрать даты в моих данных. Pandas по умолчанию представляет даты с datetime64[ns], хотя даты указаны только ежедневно. Интересно, есть ли элегантный/умный способ конвертировать даты в datetime.date или datetime64[D], так что, когда я пишу данные в CSV, даты не добавляются с 00:00:00. Я знаю, что могу преобразовать тип вручную элемент-на-элемент:Сохранять только дату при использовании pandas.to_datetime

[dt.to_datetime().date() for dt in df.dates] 

Но это очень медленно, так как у меня есть много строк, и это своего рода поражения цели использования pandas.to_datetime. Есть ли способ конвертировать dtype всего столбца сразу? Или, наоборот, pandas.to_datetime поддерживает спецификацию точности, чтобы я мог избавиться от временной части при работе с ежедневными данными?

+0

Я не знаю хороший способ, но 'df.dates.apply (лямбда х: x.date())' должны быть хотя бы немного быстрее. также посмотрите https://github.com/pydata/pandas/issues/2583 – root

+0

возможный дубликат [Как указать формат даты при использовании pandas.to \ _csv?] (http://stackoverflow.com/questions/ 13999850/how-to-define-date-format-when-using-pandas-to-csv) – unutbu

+1

Я бы рассмотрел эти два вопроса как разные. Возможный дубликат, на который вы ссылаетесь, направлен на разделение части детали и времени даты из столбца datetime. Этот вопрос мотивирован преобразованием всего столбца сразу. Представьте, что у вас есть dataframe с 20 столбцами, которые представляют даты. Вы не хотите указывать, какие столбцы писать в csv, как это было предложено в другом вопросе. – ezbentley

ответ

1

Преобразование в datetime64[D]:

df.dates.values.astype('M8[D]') 

Хотя переназначения, что к DataFrame седловине вернется обратно в [нс].

Если вы хотите реально 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)]) 
+2

Если вы используете astype ('M8 [D]'), он преобразует отсутствующие значения в дату начала, 1970-1-1. Вероятно, лучше просто использовать pandas.to_datetime() в настоящее время. –

70

Начиная с версии 0.15.0 это теперь можно легко сделать с помощью .dt для доступа только компонент даты:

df['just_date'] = df['dates'].dt.date 
+4

К сожалению, '' df ['just_date'] '' тогда имеет '' object'' dtype (и так, например, нет '' .dt'' accessor) ... любым способом избежать этого? –

+2

@PietroBattiston означает, что это, вероятно, еще строка, попробуйте преобразовать первый 'df ['just_date'] = pd.to_datetime (df ['just_date'])' вам может понадобиться передать 'format' arg' to_datetime', если он не может вывести формат – EdChum

+0

Это на самом деле '' datetime.date'' ... но это говорит, что переигрывать '' pd.to_datetime'' на нем, кажется, отлично работает, спасибо! –

8

панды DatetimeIndex и Series есть метод, называемый normalize, который делает именно то, что вы хотите.

Подробнее об этом можно узнать в this answer.

будет написан, как ser.dt.normalize()

6

Пока я upvoted ответа EdChum, который является наиболее прямым ответом на вопрос ОП, которую он на самом деле не решает проблемы производительности (она по-прежнему полагается на питон datetime объектов, и, следовательно, любая операция на них не будет векторизоваться, т. е. будет медленной).

A better performing alternative предназначено для использования df['dates'].dt.floor('d'). Строго говоря, он не «сохраняет только дату», так как он просто устанавливает время на 00:00:00. Но он работает по желанию О.П., когда, например:

  • печати на экран
  • сохранения в формат CSV
  • с помощью колонки для groupby

... и это много более эффективным, поскольку операция векторизована.

EDIT: на самом деле, ответ предпочел бы ОП является, вероятно, «последние версии pandas сделать не писать время Csv если 00:00:00 для всех наблюдений».

+0

К сожалению, 'to_json' все еще пишет полный' 00: 00: 00'. – IanS

+0

@IanS вы имеете в виду при использовании '' date_format = 'iso''' ?! По умолчанию он просто выводит секунды с эпохи. –

+0

Да, вот что я имел в виду. – IanS

-2

используется на сегодняшний день печать

import pandas as pd d='2015-01-08 22:44:09' c= pd.to_datetime(d).date() print c