如何将DataFrame中的多个列合并为Pandas日期时间。

6

我有一个pandas数据框,其值如下:

ProcessID1 UserID Date Month Year Time 248 Tony 29 4 2017 23:30:56 436 Jeff 28 4 2017 20:02:19 500 Greg 4 5 2017 11:48:29 我想知道是否有办法将日期、月份和年份以及时间列合并为pd.datetime格式?


3个回答

15

使用to_datetime函数,自动转换列 Day,Month,Year 并添加转换为时间的 time ,再使用to_timedelta函数:

df['Datetime'] = pd.to_datetime(df.rename(columns={'Date':'Day'})[['Day','Month','Year']]) + \
                 pd.to_timedelta(df['Time'])

另一个解决方案是先将所有列都转换为string,然后再进行连接:

df['Datetime'] = pd.to_datetime(df[['Date','Month','Year', 'Time']]
                   .astype(str).apply(' '.join, 1), format='%d %m %Y %H:%M:%S')

df['Datetime']  = (pd.to_datetime(df['Year'].astype(str) + '-' +
                                  df['Month'].astype(str) + '-' +
                                  df['Date'].astype(str) + ' ' +
                                  df['Time']))

print (df)
   ProcessID1 UserID  Date  Month  Year      Time            Datetime
0         248   Tony    29      4  2017  23:30:56 2017-04-29 23:30:56
1         436   Jeff    28      4  2017  20:02:19 2017-04-28 20:02:19
2         500   Greg     4      5  2017  11:48:29 2017-05-04 11:48:29

最后如果需要删除这些列:

df = df.drop(['Date','Month','Year', 'Time'], axis=1)
print (df)
   ProcessID1 UserID            Datetime
0         248   Tony 2017-04-29 23:30:56
1         436   Jeff 2017-04-28 20:02:19
2         500   Greg 2017-05-04 11:48:29

我尝试使用上述代码,但出现了KeyError: ('Day', 'Month', 'Year')的错误。 - Jithesh Erancheri
在第一个解决方案中,似乎您忘记了 rename - df.rename(columns={'Date':'Day'}) - jezrael
我已经重命名了这些列。现在,打印(df.columns.tolist())的输出为'UserID'、'Day'、'Month'、'Year'和'Time'。但是,pd.to_datetime(df["Day","Month","Year"])+ pd.to_timedelta(df['Time'])仍然会出现之前提到的KeyError错误。我正在使用Pandas 0.22版本。 - Jithesh Erancheri
@JitheshErancheri - 这些数据是机密的吗?如果不是,您可以将CSV发送到我的个人资料中的电子邮件吗? - jezrael
1
我可以与你分享 - Jithesh Erancheri
显示剩余3条评论

1
将列合并成字符串格式,使用pd.to_datetime转换为日期时间。
import pandas as pd
import io

txt = """
ProcessID1  UserID   Date   Month    Year     Time 
        248    Tony     29       4   2017  23:30:56
        436    Jeff     28       4   2017  20:02:19
        500    Greg      4       5   2017  11:48:29
"""

df = pd.read_csv(io.StringIO(txt), sep="[\t ,]+")

df['Datetime'] =  pd.to_datetime(df['Date'].astype(str) \
                                 + '-' + df['Month'].astype(str) \
                                 + '-' + df['Year'].astype(str) \
                                 + ' ' + df['Time'], 
                                 format='%d-%m-%Y %H:%M:%S')
df

0
import pandas as pd

你也可以使用 apply() 方法来实现这个功能:
df['Datetime']=df[['Year','Month','Date']].astype(str).apply('-'.join,1)+' '+df['Time']

最后使用 pandasto_datetime() 方法将'Datetime' 转换为datetime数据类型:

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

df 的输出结果:

    ProcessID1  UserID   Date   Month   Year    Time        Datetime
0   248          Tony     29    4       2017    23:30:56    2017-04-29 23:30:56
1   436          Jeff     28    4       2017    20:02:19    2017-04-28 20:02:19
2   500          Greg      4    5       2017    11:48:29    2017-05-04 11:48:29

现在,如果你想要移除'Date''Month''Year''Time'列,则可以使用以下命令:

df=df.drop(columns=['Date','Month','Year', 'Time'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接