如何从Pandas DataFrame提取连续睡眠阶段分段及对应时间戳
解决方案
步骤1:导入库并加载数据
先导入Pandas,再加载你的睡眠阶段数据(假设DataFrame名为df):
import pandas as pd # 示例数据(替换为你的实际数据) data = { 'Sleep Stage': ['SLEEP-S0', 'SLEEP-S0', 'SLEEP-MT', 'SLEEP-S0', 'SLEEP-S0', 'SLEEP-REM', 'SLEEP-REM', 'SLEEP-S2', 'SLEEP-S2', 'SLEEP-S2'], 'Time[hh:mm:ss]': ['23:27:14', '23:27:44', '23:28:14', '23:28:44', '23:29:14', '07:57:14', '07:57:44', '07:58:14', '07:58:44', '07:59:14'], 'Event': ['SLEEP-S0', 'SLEEP-S0', 'SLEEP-MT', 'SLEEP-S0', 'SLEEP-S0', 'SLEEP-REM', 'SLEEP-REM', 'SLEEP-S2', 'SLEEP-S2', 'SLEEP-S2'], 'Duration[s]': [30, 30, 30, 30, 30, 30, 30, 30, 30, 30] } df = pd.DataFrame(data)
步骤2:转换时间列格式
将时间列转为可计算的datetime类型,方便后续生成结束时间:
df['Time[hh:mm:ss]'] = pd.to_datetime(df['Time[hh:mm:ss]'], format='%H:%M:%S').dt.time
步骤3:标记连续相同阶段的分组
通过对比当前行与上一行的睡眠阶段,生成分组标识,把连续相同的阶段归为一组:
# 当睡眠阶段与上一行不同时,分组编号加1 df['group_id'] = (df['Sleep Stage'] != df['Sleep Stage'].shift(1)).cumsum()
步骤4:分组聚合生成结果
对每个分组聚合出所需字段:
STAGE:分组内的睡眠阶段(取第一个即可,同组阶段一致)START_POINT:分组的第一个时间点END_POINT:分组最后一个时间点加上对应时长(即阶段结束时间)DURATION:分组内所有时长的总和
代码实现:
result = df.groupby('group_id').agg( STAGE=('Sleep Stage', 'first'), START_POINT=('Time[hh:mm:ss]', 'first'), END_POINT=('Time[hh:mm:ss]', lambda x: (pd.to_datetime(x.iloc[-1].strftime('%H:%M:%S')) + pd.Timedelta(seconds=df.loc[x.index[-1], 'Duration[s]'])).time()), DURATION=('Duration[s]', 'sum') ).reset_index(drop=True)
最终输出示例
运行后result的格式如下:
STAGE START_POINT END_POINT DURATION 0 SLEEP-S0 23:27:14 23:28:14 60 1 SLEEP-MT 23:28:14 23:28:44 30 2 SLEEP-S0 23:28:44 23:29:44 60 3 SLEEP-REM 07:57:14 07:58:14 60 4 SLEEP-S2 07:58:14 07:59:44 90
补充说明
如果数据存在跨天情况(比如从23点到次日7点),建议给时间列补充日期信息,避免结束时间计算逻辑出错;若Event列与Sleep Stage内容完全一致,可直接忽略该列,不影响分组结果。
内容的提问来源于stack exchange,提问作者S C
相关产品推荐
相关产品推荐

