如何计算DataFrame中两个Timestamp间的活跃小时列表?
计算DataFrame中时间戳区间的活跃小时列表
要解决这个问题,我们可以利用Pandas的时间处理工具,针对每条记录的start和end时间戳生成覆盖所有活跃时段的小时列表。先来看你的示例数据和期望结果:
示例输入
| start | end |
|---|---|
| 2017-06-01 09:30:00 | 2017-06-01 11:30:00 |
| 2017-06-01 14:00:00 | 2017-06-01 14:30:00 |
期望输出
| start | end | hours_active |
|---|---|---|
| 2017-06-01 09:30:00 | 2017-06-01 11:30:00 | (9, 10, 11) |
| 2017-06-01 14:00:00 | 2017-06-01 14:30:00 | (14,) |
实现代码
下面是完整的Python/Pandas解决方案,逻辑清晰且能处理各种边界情况(比如跨天、整点结束等):
import pandas as pd # 构造示例DataFrame(你可以替换成自己的数据集) df = pd.DataFrame({ 'start': pd.to_datetime(['2017-06-01 09:30:00', '2017-06-01 14:00:00']), 'end': pd.to_datetime(['2017-06-01 11:30:00', '2017-06-01 14:30:00']) }) def extract_active_hours(row): # 将start和end向下取整到最近的整点 start_hour = row['start'].floor('H') end_hour = row['end'].floor('H') # 如果end时间不在整点(分/秒>0),需要把结束小时+1,确保包含当前小时 if row['end'].minute > 0 or row['end'].second > 0: end_hour += pd.Timedelta(hours=1) # 生成覆盖所有活跃小时的时间序列 hour_range = pd.date_range(start=start_hour, end=end_hour, freq='H') # 提取小时数并转成元组(和示例格式一致) return tuple(hour.hour for hour in hour_range) # 对每行应用函数,生成活跃小时列 df['hours_active'] = df.apply(extract_active_hours, axis=1) # 查看结果 print(df)
代码解释
- 时间取整:用
floor('H')把start和end时间戳向下对齐到最近的小时,比如09:30:00变成09:00:00。 - 边界处理:如果
end时间不在整点(比如11:30:00),说明这条记录在11:00-12:00这个小时内也有活跃时间,所以要把结束小时加1,保证date_range能包含这个小时。 - 生成小时序列:
pd.date_range会生成从start_hour到end_hour的每小时时间戳,最后提取每个时间戳的hour属性,转成元组即可。
测试边界情况
比如跨天的场景:
# 测试跨天记录 test_row = pd.Series({ 'start': pd.to_datetime('2017-06-01 23:30:00'), 'end': pd.to_datetime('2017-06-02 01:30:00') }) print(extract_active_hours(test_row)) # 输出:(23, 0, 1)
内容的提问来源于stack exchange,提问作者TrewTzu
相关产品推荐
相关产品推荐

