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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:27:03