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
我有 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