在Pandas DataFrame中对连续步行时段的时长求和
解决方案
假设使用Python Pandas处理数据,以下是实现步骤:
步骤1:导入数据并预处理
先将数据读入DataFrame,同时调整字段数据类型以适配后续计算:
import pandas as pd # 根据实际数据格式调整读取方式,示例为csv格式 df = pd.read_csv("your_accelerometer_data.csv") # 转换日期格式为日期类型,方便后续分组 df["日期(Date)"] = pd.to_datetime(df["日期(Date)"]).dt.date # 确保事件类型和时长为数值类型 df["Event Type"] = df["Event Type"].astype(float) df["时长(Duration)"] = df["时长(Duration)"].astype(float) # 若数据未按时间顺序排列,需先排序 df = df.sort_values(["日期(Date)", df.index])
步骤2:标记连续步行时段
给每个日期内**连续的步行(Event Type=2)**分配唯一组ID,核心是识别步行时段的起始点:
# 筛选出所有步行数据 walk_df = df[df["Event Type"] == 2].copy() # 标记新步行时段的起始行:要么日期切换,要么当前行与上一行索引不连续(说明中间有非步行数据,时段中断) walk_df["is_new_segment"] = (walk_df["日期(Date)"] != walk_df["日期(Date)"].shift(1)) | \ (walk_df.index != walk_df.index.shift(1) + 1) # 生成连续时段的唯一ID walk_df["segment_id"] = walk_df["is_new_segment"].cumsum()
步骤3:按日期和时段求和
按日期和时段ID分组,计算每个连续步行时段的总时长:
# 分组求和 segment_total = walk_df.groupby(["日期(Date)", "segment_id"])["时长(Duration)"].sum().reset_index() # 重命名列名更直观 segment_total.rename(columns={"时长(Duration)": "时段总时长"}, inplace=True)
步骤4:后续分析示例
如果需要计算每日平均步行时段时长,可对结果再次分组:
daily_avg = segment_total.groupby("日期(Date)")["时段总时长"].mean().reset_index() daily_avg.rename(columns={"时段总时长": "每日平均步行时段时长"}, inplace=True)
示例结果说明
针对你提供的样例数据,2021-07-07的7条连续步行数据总时长为1.1+3.2+3.5+4.3+3.7+1.2+1.1=18.1,最终segment_total中会生成一行对应记录:
| 日期(Date) | segment_id | 时段总时长 |
|---|---|---|
| 2021-07-07 | 1 | 18.1 |
补充说明
若数据包含多个用户ID,需在分组时加入ID字段,确保每个用户的步行时段独立计算,例如:
segment_total = walk_df.groupby(["ID", "日期(Date)", "segment_id"])["时长(Duration)"].sum().reset_index()
内容的提问来源于stack exchange,提问作者user1666871
相关产品推荐
相关产品推荐

