У мене є кадр даних Pandas, один із стовпців містить рядки дат у форматі YYYY-MM-DD
Наприклад, '2013-10-28'
На даний момент dtype
колона є object
.
Як перетворити значення стовпців у формат дати Pandas?
У мене є кадр даних Pandas, один із стовпців містить рядки дат у форматі YYYY-MM-DD
Наприклад, '2013-10-28'
На даний момент dtype
колона є object
.
Як перетворити значення стовпців у формат дати Pandas?
Відповіді:
Використовуйте 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
df['time'] = [time.date() for time in df['time']]
По суті еквівалент @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'])
Кидає a
ValueError: Unknown string format
Це означає, що у вас є недійсні (непримусові) значення. Якщо у вас все в порядку з їх перетворенням pd.NaT
, ви можете додати errors='coerce'
аргумент до to_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
Я думаю, багато даних надходить у Pandas з файлів CSV, і в цьому випадку ви можете просто перетворити дату під час початкового читання CSV:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
де 0 відноситься до стовпця, в якому знаходиться дата.
Ви також можете додати , index_col=0
туди, якщо хочете, щоб дата була вашим індексом.
Див. Https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Тепер ви можете це зробити df['column'].dt.date
Зауважте, що для об’єктів datetime, якщо ви не бачите години, коли всі вони 00:00:00, це не панди. Це ноутбук iPython, який намагається зробити речі виглядають красиво.
df[col] = pd.to_datetime(df[col])
спочатку перетворити стовпець на об'єкти часу.
dtype = object
який займає значно більше пам’яті, ніж істина datetime dtype
у пандах.
Ще один спосіб зробити це, і це добре працює, якщо у вас є кілька стовпців для перетворення в datetime.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
у ваших стовпцях є лише значення, перехід на datetime збереже лише відповідну інформацію. Якщо ви однозначно конвертуєте, використовуючи df['datetime_col'].dt.date
це, ви отримаєте object
dtype; втрата в управлінні пам'яттю.
Якщо ви хочете отримати формат DATE, а не DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
Може бути так, що дати потрібно переводити на іншу частоту. У цьому випадку я б запропонував встановити індекс за датами.
#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'>
Спробуйте перетворити один із рядків у мітку часу за допомогою функції pd.to_datetime, а потім використовуйте .map, щоб зіставити формуляр із цілим стовпцем
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null object
1 endDay 110526 non-null object
import pandas as pd
df['startDay'] = pd.to_datetime(df.startDay)
df['endDay'] = pd.to_datetime(df.endDay)
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null datetime64[ns]
1 endDay 110526 non-null datetime64[ns]