如何用Python读取含JSON字段的CSV并按规则统计每小时会话时长
Python处理会话时长统计宽表实现方案
核心依赖pandas库,代码加了详细注释,新手只需修改文件路径即可直接运行。
1. 前置准备
如果还未安装pandas,执行以下命令安装:
pip install pandas
2. 完整实现代码
import pandas as pd import json # -------------------------- 新手仅需修改以下两个路径 -------------------------- input_csv_path = "替换为你的原始CSV文件路径.csv" output_csv_path = "替换为你要保存的结果文件路径.csv" # --------------------------------------------------------------------------- def calc_hour_stats(row): # 初始化24个小时段的时长,默认值为0 hour_result = {f"Hour{str(i).zfill(2)}": 0 for i in range(1, 25)} # 拆分Session列的分号分隔的JSON字符串 session_json_list = row["Session"].split(";") for s_json_str in session_json_list: if not s_json_str.strip(): continue # 转JSON格式,异常格式直接跳过 try: session = json.loads(s_json_str) except: continue # 规则2:过滤时长≤9分钟的无效会话 if session["duration"] <= 9: continue start_min = session["start"] end_min = session["end"] current_min = start_min is_first_hour = True # 规则4:拆分跨小时的会话 while current_min <= end_min: # 计算当前分钟所属的小时编号(1-24,对应Hour01到Hour24) hour_num = (current_min - 1) // 60 + 1 # 当前小时的结束分钟边界 hour_end_min = hour_num * 60 # 当前统计片段的结束时间,取小时边界和会话结束时间的较小值 seg_end_min = min(hour_end_min, end_min) # 计算当前片段的时长 seg_duration = seg_end_min - current_min + 1 # 规则3:首小时额外加5分钟 if is_first_hour: seg_duration += 5 is_first_hour = False # 累计到对应小时的总时长 hour_result[f"Hour{str(hour_num).zfill(2)}"] += seg_duration # 跳转到下一个小时的起始分钟 current_min = hour_end_min + 1 return pd.Series(hour_result) if __name__ == "__main__": # 读取原始CSV,指定id和Date为字符串格式避免自动转格式出错 raw_df = pd.read_csv(input_csv_path, dtype={"id": str, "Date": str}) # 逐行处理会话数据,生成小时统计列 hour_stats_df = raw_df.apply(calc_hour_stats, axis=1) # 合并id、Date和小时统计列 result_df = pd.concat([raw_df[["id", "Date"]], hour_stats_df], axis=1) # 按id+Date维度聚合,同维度多行数据自动合并求和 result_df = result_df.groupby(["id", "Date"], as_index=False).sum() # 导出结果,用utf_8_sig编码避免Excel打开乱码 result_df.to_csv(output_csv_path, index=False, encoding="utf_8_sig") print(f"处理完成,结果已保存至:{output_csv_path}")
3. 注意事项
- 所有业务规则都封装在
calc_hour_stats函数中,后续调整规则只需修改该函数即可 - 代码加入了异常捕获,部分格式错误的会话数据会自动跳过,不会导致整体运行中断
- 导出结果为标准宽表格式,每一行对应唯一的id+Date组合,24个小时列直接展示各时段总有效时长
内容的提问来源于stack exchange,提问作者Mei
相关产品推荐
相关产品推荐

