Как преобразовать даты в фреймворк Pandas в тип данных 'date'? - программирование
Подтвердить что ты не робот

Как преобразовать даты в фреймворк Pandas в тип данных 'date'?

У меня есть кадр данных Pandas, один из столбцов которого содержит строки даты в формате "YYYY-MM-DD", например. '2013-10-28'.

В настоящий момент dtype столбца является "объектом".

Как преобразовать значения столбцов в формат даты Pandas?

4b9b3361

Ответ 1

Используйте astype

In [31]: df
Out[31]: 
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [32]: df['time'] = df['time'].astype('datetime64[ns]')

In [33]: df
Out[33]: 
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

Ответ 2

По сути эквивалентно @waitingkuo, но я бы использовал здесь to_datetime (кажется, он немного чище и предлагает некоторые дополнительные функции, например, dayfirst):

In [11]: df
Out[11]:
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [12]: pd.to_datetime(df['time'])
Out[12]:
0   2013-01-01 00:00:00
1   2013-01-02 00:00:00
2   2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]

In [13]: df['time'] = pd.to_datetime(df['time'])

In [14]: df
Out[14]:
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

Обработка ValueError s
Если вы столкнетесь с ситуацией, когда делать

df['time'] = pd.to_datetime(df['time'])

Бросает

ValueError: Unknown string format

Это означает, что у вас есть недопустимые (не принудительные) значения. Если вы pd.NaT с преобразованием их в pd.NaT, вы можете добавить аргумент errors='coerce' в to_datetime:

df['time'] = pd.to_datetime(df['time'], errors='coerce')

Ответ 3

Я предполагаю, что в CSV файлы входит множество данных Pandas, и в этом случае вы можете просто преобразовать дату во время начального чтения CSV:

dfcsv = pd.read_csv('xyz.csv', parse_dates=[0]), где 0 относится к столбцу, в котором находится дата.
Вы также можете добавить , index_col=0, если хотите, чтобы дата была вашим индексом.

См. http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

Ответ 4

Теперь вы можете сделать df['column'].dt.date

Обратите внимание, что для объектов datetime, если вы не видите час, когда они все 00:00:00, это не pandas. Этот iPython-ноутбук пытается сделать все красивым.

Ответ 5

Возможно, даты должны быть преобразованы на другую частоту. В этом случае я бы предложил установить индекс по датам.

#set an index by dates
df.set_index(['time'], drop=True, inplace=True)

После этого вы можете более легко преобразовать формат формата даты, который вам понадобится больше всего. Ниже я последовательно конвертирую в число форматов даты, в конечном итоге заканчивая набором ежедневных дат в начале месяца.

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

#Convert to monthly dates
df.index = df.index.to_period(freq='M')

#Convert to strings
df.index = df.index.strftime('%Y-%m')

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

Для краткости я не показываю, что после каждой строки выше я запускаю следующий код:

print(df.index)
print(df.index.dtype)
print(type(df.index))

Это дает мне следующий результат:

Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>

Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

Ответ 6

Еще один способ сделать это, и это хорошо работает, если у вас есть несколько столбцов для преобразования в дату и время. cols = ['date1', 'date2'] df [cols] = df [cols].apply(pd.to_datetime)