如何将Pandas数据框中的日期转换为"日期"数据类型?

use*_*289 85 python date pandas

我有一个Pandas数据框,其中一列包含格式为'YYYY-MM-DD'的日期字符串,例如'2013-10-28'.

目前,列的dtype是'object'.

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

And*_*den 98

基本上相当于@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
Run Code Online (Sandbox Code Playgroud)

处理ValueErrors
如果遇到这种情况

df['time'] = pd.to_datetime(df['time'])
Run Code Online (Sandbox Code Playgroud)

抛出一个

ValueError: Unknown string format
Run Code Online (Sandbox Code Playgroud)

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

df['time'] = pd.to_datetime(df['time'], errors='coerce')
Run Code Online (Sandbox Code Playgroud)


wai*_*kuo 89

使用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
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过`df ['time'] = [time.date()将其转换为df ['time']中的时间] (5认同)
  • [ns]是什么意思,你可以将文本字符串作为日期并删除该日期的时间部分吗? (3认同)

fan*_*ous 27

我想很多数据都是从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


sze*_*lin 18

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

请注意,对于datetime对象,如果你没有看到它们都是00:00:00的小时,那就不是pandas.这是iPython笔记本试图让事情看起来很漂亮.

  • 这个对我不起作用,它抱怨:只能使用具有类似日期时间的值的 .dt 访问器 (2认同)
  • 您可能必须先执行 `df[col] = pd.to_datetime(df[col])` 才能将列转换为日期时间对象。 (2认同)
  • 这个答案的问题在于它将列转换为 `dtype = object`,这比 Pandas 中真正的 `datetime dtype` 占用更多的内存。 (2认同)

Dav*_*tia 8

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

df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
Run Code Online (Sandbox Code Playgroud)


SSS*_*SSS 6

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

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
Run Code Online (Sandbox Code Playgroud)