在Pandas中根据睡眠/唤醒时间区间设置二进制wake列
修正代码实现wake二进制列的生成
原代码存在的问题
- 字段引用错误:原代码使用
df_clean2.time,但数据集实际字段名为current_time,导致逻辑判断基于错误字段 - 逻辑关系反转:
np.where的取值逻辑与需求不符,原代码满足「不在睡眠区间」时保留初始值0,否则设为1,而实际需求是「处于睡眠区间内」为0,「不在区间内」为1 - 潜在类型问题:若时间字段为字符串类型,直接比较会导致逻辑错误,需确保字段为时间类型(如
datetime.time)
修正后的代码
第一步:确保时间字段为正确类型(若原始数据是字符串格式)
from datetime import datetime # 将字符串格式的时间转换为time类型 df_clean2['current_time'] = df_clean2['current_time'].apply(lambda x: datetime.strptime(x, '%H:%M').time()) df_clean2['asleep'] = df_clean2['asleep'].apply(lambda x: datetime.strptime(x, '%H:%M').time()) df_clean2['wokeup'] = df_clean2['wokeup'].apply(lambda x: datetime.strptime(x, '%H:%M').time())
第二步:生成wake列
import numpy as np # 核心逻辑:current_time在asleep到wokeup区间内时赋值0,否则赋值1 df_clean2['wake'] = np.where( (df_clean2['current_time'] >= df_clean2['asleep']) & (df_clean2['current_time'] <= df_clean2['wokeup']), 0, 1 )
补充:处理跨天睡眠场景(如asleep为22:00,wokeup为06:00)
如果存在睡眠区间跨午夜的情况,需要调整逻辑判断:
df_clean2['wake'] = np.where( # 分两种情况:区间不跨天 或 区间跨天且current_time在00:00到wokeup之间 ((df_clean2['asleep'] <= df_clean2['wokeup']) & (df_clean2['current_time'] >= df_clean2['asleep']) & (df_clean2['current_time'] <= df_clean2['wokeup'])) | ((df_clean2['asleep'] > df_clean2['wokeup']) & (df_clean2['current_time'] >= df_clean2['asleep']) | (df_clean2['current_time'] <= df_clean2['wokeup'])), 0, 1 )
内容的提问来源于stack exchange,提问作者dspractician
相关产品推荐
相关产品推荐

