熊猫-将字符串转换为没有日期的时间

我读了很多这样的答案,但是找不到一个清晰的答案。

我在一个名为 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>
99056 次浏览

执行转换后,您可以使用日期时间访问器 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)

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

我最近也在与这个问题作斗争。我的方法接近于 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数据格式的同时只显示日期,从而使计算成为可能。

我的答案决不比另外两个好。我只是想提供一种不同的方法,希望能有所帮助。