2016-08-04 329 views
2

目前我的日期被格式化为一个字符串。我能得到字符串转换为日期时间使用如下:熊猫日期时间格式化

df['submitted_on'] = df['submitted_on'].apply(lambda x: dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S.%f')) 

我想删除时间戳,但我有一个非常困难的时候这样做。我的首选格式是%Y%m%d。所以我偶然发现THIS页面,并添加了.date()。结果如下:

df['submitted_on'] = df['submitted_on'].apply(lambda x: dt.datetime.strptime(x, '%Y%m%d').date()) 

我得到这个值的错误,我又失去了做什么来放下时间戳。任何帮助是极大的赞赏。

ValueError: time data '2015-02-26 16:45:36.0' does not match format '%Y%m%d'

+0

请发布示例DataFrame。 – Alex

回答

1
s = pd.Series(['2010-01-01 10:00', '2010-06-01 11:00']) 

pd.to_datetime(pd.to_datetime(s).dt.date) 
2

您可以使用normalizedocs)。

dti = pd.DatetimeIndex(start='today', periods=4, freq='D') 
dti 

输出

DatetimeIndex(['2016-08-04 14:30:34.447589', '2016-08-05 14:30:34.447589', 
       '2016-08-06 14:30:34.447589', '2016-08-07 14:30:34.447589'], 
       dtype='datetime64[ns]', freq='D') 

而且

dti.normalize() 

输出

DatetimeIndex(['2016-08-04', '2016-08-05', '2016-08-06', '2016-08-07'], dtype='datetime64[ns]', freq='D') 

如果它是时间戳的一个系列,你可以将它们转换地图。

编辑:@ piRSquared的方式在这种情况下更好。

pd.to_datetime(dti).map(lambda dt: dt.date()) 

输出

array([datetime.date(2016, 8, 4), datetime.date(2016, 8, 5), 
     datetime.date(2016, 8, 6), datetime.date(2016, 8, 7)], dtype=object) 
+0

谢谢亚历克斯。把dti.normalize()应用到我的整个数据框还是应该只对日期时间列进行标准化? – anshanno

2

您可以在Timestamp对象转换为datetime.datetime对象并提取datetime.date部分,如图:

In [7]: import pandas as pd 

In [8]: print(pd.Timestamp('2015-02-26 16:45:36.0').to_datetime().date()) 
2015-02-26 
<class 'datetime.date'> 

你想要的格式:

In [11]: print(pd.Timestamp('2015-02-26 16:45:36.0').to_datetime().date().strftime("%Y%m%d")) 
20150226 
<class 'str'>