2015-05-01 3 views
-1

У меня есть две даты в dataframes pandas (df1.a_date & df2.another_date), прочитанные из CSV-файлов. Они совпадают на уровне даты (ГГГГ-ММ-ДД), но не в то время (ЧЧ: ММ: СС). Оба считываются как объект dtype: object.Соответствующие две аналогичные даты с разным временем

Мне нужно объединить два кадра данных по датам, но, поскольку они не являются точными, мне, вероятно, сначала нужно их преобразовать. Есть идеи?

редактировать:

Я попытался с помощью diatomite.date построить новую дату от pandas.datetime, но это не похоже на работу.

datetime.date(df.a_date.year, df.a_date.month, df.a_date.day) 

Объекты pandas datetime не имеют год, месяц, аксессоры дня.

+0

Вы конвертируете столбец datetime в дату. Сохраните его в другом столбце и «слейте» в этих столбцах. – fixxxer

+0

Это в основном то, что я пытался выяснить, но я не могу придумать точный код. Можете ли вы (или кто-то другой) привести пример? –

+0

Пожалуйста, начните с того, что вы попробуете. http://stackoverflow.com/help/mcve – fixxxer

ответ

0

Вы можете нормализовать индекс даты колонки/DatetimeIndex:

Примечание: На данный момент нормализуются не экспортируется в дт аксессору поэтому нам нужно обернуть DatetimeIndex.

In [11]: df = pd.DataFrame(pd.date_range('2015-01-01 05:00', periods=3), columns=['datetime']) 

In [12]: df 
Out[12]: 
      datetime 
0 2015-01-01 05:00:00 
1 2015-01-02 05:00:00 
2 2015-01-03 05:00:00 

In [13]: df["date"] = pd.DatetimeIndex(df["datetime"]).normalize() 

In [14]: df 
Out[14]: 
      datetime  date 
0 2015-01-01 05:00:00 2015-01-01 
1 2015-01-02 05:00:00 2015-01-02 
2 2015-01-03 05:00:00 2015-01-03 

Это работает, если это DatetimeIndex тоже использовать df.index, а не df[col_name].

0

Форматирование даты и времени, чтобы включать только YYYY-MM-DD:

предполагая ФР ваш dataframe:

'{:%Y-%m-%d}'.format(d) 
0

Предположим, ТСП ваш dataframe и столбец 'индекс' содержит DateTime:

In [1804]: dft.head() 
Out[1804]: 
       index   A 
0 2013-01-01 00:00:00 1.193366 
1 2013-01-01 00:01:00 1.013425 
2 2013-01-01 00:02:00 1.281902 
3 2013-01-01 00:03:00 -0.043788 
4 2013-01-01 00:04:00 -1.610164 

Вы можете преобразовать столбец, содержащий только дату, и сохранить его в другом столбце, если хотите. И работать на том, что:

In [1805]: dft['index'].apply(lambda v:v.date()).head() 
Out[1805]: 
0 2013-01-01 
1 2013-01-01 
2 2013-01-01 
3 2013-01-01 
4 2013-01-01 
Name: index, dtype: object 
+0

Спасибо! Это сделал трюк. Теперь мне просто нужно иметь дело с отсутствующими значениями. –

+1

@NicholasTulach Это будет намного медленнее, чем использование dt.date или dt.normalize (нормализовать бытие самого быстрого). –