我已阅读大量的SO答案,但无法找到明确的解决方案。
我将这些数据放在名为day1
的df中,代表小时:
1 10:53
2 12:17
3 14:46
4 16:36
5 18:39
6 20:31
7 22:28
Name: time, dtype: object>
我想将其转换为时间格式。但是当我这样做时:
day1.time = pd.to_datetime(day1.time, format='H%:M%')
结果包括今天的日期:
1 2015-09-03 10:53:00
2 2015-09-03 12:17:00
3 2015-09-03 14:46:00
4 2015-09-03 16:36:00
5 2015-09-03 18:39:00
6 2015-09-03 20:31:00
7 2015-09-03 22:28:00
Name: time, dtype: datetime64[ns]>
似乎format
参数不起作用 - 如何在没有日期的情况下获得此处显示的时间?
更新
以下格式正确的时间,但不知何故,列仍然是对象类型。为什么它不能转换为datetime64
?
day1['time'] = pd.to_datetime(day1['time'], format='%H:%M').dt.time
1 10:53:00
2 12:17:00
3 14:46:00
4 16:36:00
5 18:39:00
6 20:31:00
7 22:28:00
Name: time, dtype: object>
答案 0 :(得分:29)
执行转换后,您可以使用日期时间访问者dt
仅访问hour
或time
组件:
In [51]:
df['hour'] = pd.to_datetime(df['time'], format='%H:%M').dt.hour
df
Out[51]:
time hour
index
1 10:53 10
2 12:17 12
3 14:46 14
4 16:36 16
5 18:39 18
6 20:31 20
7 22:28 22
您的格式字符串H%:M%
格式错误,可能会引发ValueError: ':' is a bad directive in format 'H%:M%'
关于您的上次评论,dtype为datetime.time
而不是datetime
:
In [53]:
df['time'].iloc[0]
Out[53]:
datetime.time(10, 53)
答案 1 :(得分:4)
您可以使用to_timedelta
pd.to_timedelta(df+':00')
Out[353]:
1 10:53:00
2 12:17:00
3 14:46:00
4 16:36:00
5 18:39:00
6 20:31:00
7 22:28:00
Name: Time, dtype: timedelta64[ns]
答案 2 :(得分:1)
我最近也为这个问题苦苦挣扎。我的方法与EdChum的方法很接近,结果与YOBEN_S的答案相同。
就像EdChum所说明的那样,使用dt.hour
或dt.time
将为您提供一个datetime.time对象,该对象可能只适合显示。我几乎不能对这些对象进行任何比较或计算。因此,如果您需要对结果列进行任何进一步的比较或计算操作,最好避免使用此类数据格式。
我的方法是从to_datetime
结果中减去日期:
c = pd.Series(['10:23', '12:17', '14:46'])
pd.to_datetime(c, format='%H:%M') - pd.to_datetime(c, format='%H:%M').dt.normalize()
结果是
0 10:23:00
1 12:17:00
2 14:46:00
dtype: timedelta64[ns]
dt.normalize()
基本上将所有时间分量设置为00:00:00,并且仅在保留datetime64
数据格式的同时显示日期,从而可以进行计算。
我的回答绝不比其他两个要好。我只想提供一种不同的方法,希望对您有所帮助。