Pandas - 将字符串转换为时间(不包含日期)

76

我读了很多 Stack Overflow 的答案,但找不到一个清晰的解决方案。

我有一个名为 day1 的数据框,其中包含表示小时的数据:

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>
3个回答

61

执行转换后,您可以使用日期时间访问器dt来访问只有hourtime组件:

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)

17
你可以使用 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]

10

我最近也遇到了这个问题。我的方法与EdChum的方法相似,结果与YOBEN_S的答案相同。

就像EdChum所说明的那样,使用dt.hourdt.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 数据格式,因此可以进行计算。

我的回答并不一定比其他两个更好。我只是想提供一个不同的方法,希望能够帮助到你。


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