在Pandas DataFrame中统计起止时间范围内的小时并按值分组
实现步骤
我们可以通过时间格式转换、整点序列生成、频次统计三个核心步骤完成需求,具体代码和逻辑如下:
1. 导入库并构造初始数据
import pandas as pd # 构造你的原始数据 data = { 'start_time': ['10:00:00', '13:00:00', '12:00:00', '13:00:00', '11:00:00', '09:00:00'], 'end_time': ['14:00:00', '20:00:00', '15:00:00', '19:00:00', '15:00:00', '14:00:00'] } df = pd.DataFrame(data)
2. 转换时间列类型
将字符串格式的时间转为datetime类型,方便后续时间运算:
df['start_time'] = pd.to_datetime(df['start_time'], format='%H:%M:%S') df['end_time'] = pd.to_datetime(df['end_time'], format='%H:%M:%S')
3. 生成每行的整点序列
定义函数,对每行生成包含起始时间、不包含结束时间的所有整点:
def extract_hours(row): # closed='left' 表示包含start_time,排除end_time return pd.date_range(start=row['start_time'], end=row['end_time'], freq='H', closed='left').time # 应用函数到每行,得到该行的整点列表 df['hour_list'] = df.apply(extract_hours, axis=1)
4. 统计整点出现次数
将所有整点数据展开后,统计每个整点的出现频次,最后整理成目标格式:
# 展开所有整点数据,把列表拆成单行 all_hours = df['hour_list'].explode() # 统计频次并重置索引 result_df = all_hours.value_counts().reset_index() # 修改列名匹配需求 result_df.columns = ['time', 'count'] # 将时间格式转回字符串(与示例格式一致) result_df['time'] = result_df['time'].astype(str) # 按时间排序(可选,根据需求调整) result_df = result_df.sort_values('time').reset_index(drop=True)
最终说明
运行上述代码后,result_df即为统计结果。注:你提供的示例结果存在数据误差,实际按原始数据统计时,13:00:00会出现在全部6行的时段中,对应count应为6。
内容的提问来源于stack exchange,提问作者Cace
相关产品推荐
相关产品推荐

