130

我有一个 Pandas 数据框,其中一列包含格式为日期字符串YYYY-MM-DD

例如'2013-10-28'

目前该dtype列的 是object

如何将列值转换为 Pandas 日期格式?

4

10 回答 10

137

基本上等同于@waitingkuo,但我会pd.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

处理ValueErrors
如果你遇到了正在做的情况

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

抛出一个

ValueError: Unknown string format

这意味着您的值无效(不可强制)。如果您可以将它们转换为pd.NaT,您可以添加一个errors='coerce'参数to_datetime

df['time'] = pd.to_datetime(df['time'], errors='coerce')
于 2013-05-31T09:46:26.553 回答
132

使用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
于 2013-05-31T08:36:33.777 回答
43

我想很多数据从 CSV 文件进入 Pandas,在这种情况下,您可以在初始 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

于 2014-03-19T04:15:07.860 回答
24

现在你可以做df['column'].dt.date

请注意,对于日期时间对象,如果您没有看到它们都是 00:00:00 的小时,那不是熊猫。那是 iPython notebook 试图让事情看起来很漂亮。

于 2015-11-07T00:22:59.540 回答
13

如果要获取 DATE 而不是 DATETIME 格式:

df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
于 2019-12-06T19:50:15.797 回答
6

另一种执行此操作的方法,如果您有多个列要转换为日期时间,则此方法效果很好。

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
于 2019-04-29T14:18:46.973 回答
2

可能需要将日期转换为不同的频率。在这种情况下,我建议按日期设置索引。

#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'>
于 2017-10-17T21:30:24.940 回答
1

为了完整起见,另一种可能不是最直接的选项,有点类似于@SSS 提出的选项,但使用 datetime 库是:

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
于 2020-08-16T02:13:27.670 回答
0
 #   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]
于 2020-06-24T03:28:07.947 回答
-1

尝试使用 pd.to_datetime 函数将其中一行转换为时间戳,然后使用 .map 将公式映射到整个列

于 2020-02-13T16:59:47.520 回答