将float64列转换为datetime pandas

时间:2017-03-30 11:41:26

标签: python python-3.x pandas datetime dataframe

我有以下pandas DataFramedfA['TradeDate']

0     20100329.0
1     20100328.0
2     20100329.0
...

我希望将其转换为日期时间。

基于SO上的另一个步骤,我首先将其转换为字符串,然后应用strptime函数。

dfA['TradeDate'] = datetime.datetime.strptime( dfA['TradeDate'].astype('int').to_string() ,'%Y%m%d')

然而,这会返回我的格式不正确的错误(ValueError)。

我发现的一个问题是该列不适合字符串,而是一个对象。

当我尝试:

dfA['TradeDate'] = datetime.datetime.strptime( dfA['TradeDate'].astype(int).astype(str),'%Y%m%d')

它返回:必须是Str而不是Series。

4 个答案:

答案 0 :(得分:5)

您可以使用:

df['TradeDate'] = pd.to_datetime(df['TradeDate'], format='%Y%m%d.0')
print (df)
   TradeDate
0 2010-03-29
1 2010-03-28
2 2010-03-29

但如果有一些错误的值,请添加errors='coerce'以将其替换为NaT

print (df)
    TradeDate
0  20100329.0
1  20100328.0
2  20100329.0
3  20153030.0
4         yyy

df['TradeDate'] = pd.to_datetime(df['TradeDate'], format='%Y%m%d.0', errors='coerce')
print (df)
   TradeDate
0 2010-03-29
1 2010-03-28
2 2010-03-29
3        NaT
4        NaT

答案 1 :(得分:1)

您可以在值的字符串表示中使用to_datetime自定义格式:

import pandas as pd
pd.to_datetime(pd.Series([20100329.0, 20100328.0, 20100329.0]).astype(str), format='%Y%m%d.0')

答案 2 :(得分:0)

strptime函数适用于单个值,而不适用于系列。您需要将该函数应用于列的每个元素

尝试pandas.to_datetime方法

例如

dfA = pandas.DataFrame({"TradeDate" : [20100329.0,20100328.0]})
pandas.to_datetime(dfA['TradeDate'], format = "%Y%m%d")

dfA['TradeDate'].astype(int).astype(str)\ 
    .apply(lambda x:datetime.datetime.strptime(x,'%Y%m%d'))

答案 3 :(得分:0)

在您第一次尝试时,您尝试将其转换为字符串,然后转到strptime,结果为ValueError。这是因为dfA['TradeDate'].astype('int').to_string()创建了一个包含所有日期及其行号的字符串。您可以将其更改为

dates = dfA['TradeDate'].astype('int').to_string(index=False).split()
dates
[u'20100329.0', u'20100328.0', u'20100329.0']

获取日期列表。然后使用python list comprehension将每个元素转换为 datetime

dfA['TradeDate'] = [datetime.strptime(x, '%Y%m%d.0') for x in dates]