如何将年,月和日列合并到单个日期时间列?

时间:2018-01-08 18:08:59

标签: python pandas date datetime timestamp

我有以下数据框df

        id  lat        lon      year    month   day         
0       381 53.30660   -0.54649 2004    1       2       
1       381 53.30660   -0.54649 2004    1       3            
2       381 53.30660   -0.54649 2004    1       4   

我想创建一个新列df['Date'],其中yearmonthday列根据格式yyyy-m-d进行组合。< / p>

关注this post,我做了:

`df['Date']=pd.to_datetime(df['year']*10000000000
                           +df['month']*100000000
                           +df['day']*1000000,
                           format='%Y-%m-%d%')`

结果不是我所期望的,因为它从1970年而不是2004年开始,它还包含小时标记,我没有指明:

        id  lat        lon      year    month   day  Date           
0       381 53.30660   -0.54649 2004    1       2    1970-01-01 05:34:00.102    
1       381 53.30660   -0.54649 2004    1       3    1970-01-01 05:34:00.103         
2       381 53.30660   -0.54649 2004    1       4    1970-01-01 05:34:00.104

由于日期应该是2004-1-2格式,我做错了什么?

4 个答案:

答案 0 :(得分:7)

有一种更简单的方法:

In [250]: df['Date']=pd.to_datetime(df[['year','month','day']])

In [251]: df
Out[251]:
    id      lat      lon  year  month  day       Date
0  381  53.3066 -0.54649  2004      1    2 2004-01-02
1  381  53.3066 -0.54649  2004      1    3 2004-01-03
2  381  53.3066 -0.54649  2004      1    4 2004-01-04

来自docs

  

从DataFrame的多个列组装日期时间。按键   可以是常见缩写,例如[yearmonthdayminute,   secondmsusns])或复数

答案 1 :(得分:3)

一种解决方案是将这些列转换为字符串,使用agg + str.join进行连接,然后转换为datetime

df['Date'] = pd.to_datetime(
    df[['year', 'month', 'day']].astype(str).agg('-'.join, axis=1))

df

    id      lat      lon  year  month  day       Date
0  381  53.3066 -0.54649  2004      1    2 2004-01-02
1  381  53.3066 -0.54649  2004      1    3 2004-01-03
2  381  53.3066 -0.54649  2004      1    4 2004-01-04

如果您的列之间的日期时间组合无效,则可能还需要添加errors='coerce'参数。

答案 2 :(得分:3)

修复您的代码

df['Date']=pd.to_datetime(df.year*10000+df.month*100+df.day,format='%Y%m%d')
df
Out[57]: 
    id      lat      lon  year  month  day       Date
0  381  53.3066 -0.54649  2004      1    2 2004-01-02
1  381  53.3066 -0.54649  2004      1    3 2004-01-03
2  381  53.3066 -0.54649  2004      1    4 2004-01-04

答案 3 :(得分:1)

我一直在努力寻找解决方案,因为我正在处理带有西班牙语列的数据集。我将它们翻译成“年”,“月”,“天”和“小时”后,转换就完美了