Pandas timedeltas 忽略日期

Pandas timedeltas ignoring date

我有 2 个 pandas 系列,每个系列包含一个时间作为字符串:

times = pd.DataFrame({'bedtime': ['23:00', '0:30', '1:00'], 'waketime': ['6:00', '6:00', '4:00']})
print(times)

  bedtime waketime
0   23:00     6:00
1    0:30     6:00
2    1:00     4:00

我想计算时间之间的差异(本质上是睡眠时间),但是,我没有日期信息,所以有点问题

我首先将每个系列转换为日期时间:

FMT = "%H:%M"
bedtime = pd.to_datetime(times["bedtime"], format=FMT)
waketime = pd.to_datetime(times["waketime"], format=FMT)

此过程向时间添加了一个日期,这是我不想要的:

print(bedtime)
1900-01-01 23:00:00
1900-01-01 00:30:00
1900-01-01 01:00:00

由于添加了日期,时间增量偶尔会偏移一天:

hours_in_bed = waketime - bedtime
print(hours_in_bed)

-1 days +07:00:00
         05:30:00
         03:00:00

当不需要实际日期时,计算时间增量的正确方法是什么?我基本上只想计算从睡觉到起床 小时 的持续时间

我看过其他关于如何从 datetime 对象中删除日期的问题,但在这里我更关心 correcting/removing 时间增量中的 1 天偏移

您可以使用 to_timedelta 转换 times,但问题仍然存在:

FMT = "%H:%M"
bedtime = pd.to_timedelta(times["bedtime"] + ':00', 'h')
waketime = pd.to_timedelta(times["waketime"] + ':00', 'h')
print(bedtime)
0   23:00:00
1   00:30:00
2   01:00:00
Name: bedtime, dtype: timedelta64[ns]

print(waketime)
0   06:00:00
1   06:00:00
2   04:00:00
Name: waketime, dtype: timedelta64[ns]

hours_in_bed = waketime - bedtime
print(hours_in_bed)
0   -1 days +07:00:00
1            05:30:00
2            03:00:00
dtype: timedelta64[ns]

解决方案只是解析 seconds 并使用带有参数 s:

to_timedelta
hours_in_bed = pd.to_timedelta(hours_in_bed.dt.seconds, unit='s')
print(hours_in_bed)
0   07:00:00
1   05:30:00
2   03:00:00
dtype: timedelta64[ns]

如果需要在hours输出,除以3600.0:

hours_in_bed = hours_in_bed.dt.seconds / 3600.0
print(hours_in_bed)
0    7.0
1    5.5
2    3.0
dtype: float64

您的 delta 包含负日这一事实仅反映了一个人入睡时间(23:00:00)晚于起床时间(6:00)这一事实。您要么需要将日期添加到原始数据框,要么接受它。您可以轻松消除日部分:

hours_in_bed.apply(lambda x : (x.components.hours,x.components.minutes))
#0     (7, 0)
#1    (5, 30)
#2     (3, 0)
#dtype: object