如何用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
相关产品推荐
相关产品推荐

