在Python Pandas中将时间对象转换为日期时间格式

5

我有一个名为DateTime的列数据集,数据类型为object

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

我使用上述代码将其转换为日期时间格式,然后在列中进行了拆分,以便单独获得日期时间
df['date'] = df['DateTime'].dt.date
df['time'] = df['DateTime'].dt.time

但在拆分后,格式更改为对象类型,将其转换为日期时间时,时间列名显示错误: TypeError:无法转换为日期时间

如何将时间列转换为日期时间格式


你说的“正确的时间格式”是什么意思?请展示一下你使用的代码,它产生了“TypeError: is not convertible to datetime”的错误。 - Jon Clements
我展示的转换DateTime的代码是相同的,即 df['time'] = pd.to_datetime(df.['time']) - Nadeem Haque
@NadeemHaque - 转换为字符串是必要的,例如 df['time'] = pd.to_datetime(df.['time'].astype(str)),但是需要添加一些日期,因为没有日期的日期时间不存在。 - jezrael
1
@jezrael 我是 Python 的新手,所以有些困惑。谢谢你的帮助。 - Nadeem Haque
2个回答

5

您可以在列表推导式中使用 combine 方法和 zip 函数:

df = pd.DataFrame({'DateTime': ['2011-01-01 12:48:20', '2014-01-01 12:30:45']})
df['DateTime'] = pd.to_datetime(df['DateTime'])

df['date'] = df['DateTime'].dt.date
df['time'] = df['DateTime'].dt.time

import datetime
df['new'] = [datetime.datetime.combine(a, b) for a, b in zip(df['date'], df['time'])]
print (df)

             DateTime        date      time                 new
0 2011-01-01 12:48:20  2011-01-01  12:48:20 2011-01-01 12:48:20
1 2014-01-01 12:30:45  2014-01-01  12:30:45 2014-01-01 12:30:45

或将其转换为字符串,拼接在一起再次转换:
df['new'] = pd.to_datetime(df['date'].astype(str) + ' ' +df['time'].astype(str))
print (df)
             DateTime        date      time                 new
0 2011-01-01 12:48:20  2011-01-01  12:48:20 2011-01-01 12:48:20
1 2014-01-01 12:30:45  2014-01-01  12:30:45 2014-01-01 12:30:45

但是,如果使用 floor 来将时间转换为时间差并删除时间,则只需使用 +

df['date'] = df['DateTime'].dt.floor('d')
df['time'] = pd.to_timedelta(df['DateTime'].dt.strftime('%H:%M:%S'))

df['new'] = df['date'] + df['time']
print (df)

             DateTime       date     time                 new
0 2011-01-01 12:48:20 2011-01-01 12:48:20 2011-01-01 12:48:20
1 2014-01-01 12:30:45 2014-01-01 12:30:45 2014-01-01 12:30:45

1
如何将时间列转换回日期时间格式
似乎存在误解。Pandas的datetime系列必须包括日期和时间组件。这是不可调和的。您只需使用pd.to_datetime而不指定日期,使用默认的1900-01-01日期即可。
# date from jezrael

print(pd.to_datetime(df['time'], format='%H:%M:%S'))

0   1900-01-01 12:48:20
1   1900-01-01 12:30:45
Name: time, dtype: datetime64[ns]

或者使用另一个日期组件,例如今天的日期:

today = pd.Timestamp('today').strftime('%Y-%m-%d')
print(pd.to_datetime(today + ' '  + df['time'].astype(str)))

0   2018-11-25 12:48:20
1   2018-11-25 12:30:45
Name: time, dtype: datetime64[ns]

或者重新组合您的日期时间序列:

print(pd.to_datetime(df['date'].astype(str) + ' ' + df['time'].astype(str)))

0   2011-01-01 12:48:20
1   2014-01-01 12:30:45
dtype: datetime64[ns]

@NadeemHaque, 很高兴我的回答对你有所帮助。请考虑将其标记为正确的答案,这样可以帮助其他查看此问题的人。 - jpp

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