You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas按天统计1小时时间槽内匹配起止时间范围的记录行数

实现思路
  • 第一步:先将数据里的begin_time和end_time字段转换为pandas datetime格式,方便后续时间运算
  • 第二步:对每条记录,计算它覆盖的所有整小时时间槽的起始时间:取begin_time的整点作为起始小时,end_time的整点作为结束小时,生成两个时间点之间所有1小时间隔的整点时间序列
  • 第三步:将每条记录对应的所有小时槽展开成独立行,再按日期、小时槽分组统计数量即可
完整可运行代码
import pandas as pd

# 1. 读取输入数据,可替换为实际读表代码如pd.read_csv
df = pd.DataFrame({
    'begin_time': ['2020-01-01 11:02:10', '2020-01-01 12:22:20', '2020-01-02 09:02:24'],
    'end_time': ['2020-01-01 12:33:05', '2020-01-01 13:01:51', '2020-01-02 11:33:46']
})

# 2. 转换时间字段为datetime类型
df['begin_time'] = pd.to_datetime(df['begin_time'])
df['end_time'] = pd.to_datetime(df['end_time'])

# 3. 为每条记录生成覆盖的所有整点小时
def get_hour_slots(row):
    start_hour = row['begin_time'].floor('H')
    end_hour = row['end_time'].floor('H')
    return pd.date_range(start=start_hour, end=end_hour, freq='H')

df['hour_slot'] = df.apply(get_hour_slots, axis=1)
# 4. 展开小时槽,每个小时槽对应一行
df_expand = df.explode('hour_slot', ignore_index=True)

# 5. 按日期和小时槽分组计数
df_expand['date'] = df_expand['hour_slot'].dt.date
df_expand['time_slot'] = df_expand['hour_slot'].dt.strftime('%H:%M') + ' - ' + (df_expand['hour_slot'] + pd.Timedelta(hours=1)).dt.strftime('%H:%M')
result = df_expand.groupby(['date', 'time_slot'], as_index=False)['begin_time'].count().rename(columns={'begin_time': 'count'})

# 6. 按要求格式输出
for date in result['date'].unique():
    print(f'# for {date}')
    print(result[result['date'] == date][['time_slot', 'count']].to_string(index=False))
    print('-'*30)
运行输出示例
# for 2020-01-01
    time_slot  count
11:00 - 12:00      1
12:00 - 13:00      2
13:00 - 14:00      1
------------------------------
# for 2020-01-02
    time_slot  count
09:00 - 10:00      1
10:00 - 11:00      1
11:00 - 12:00      1
------------------------------

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:39:03