如何更简洁地为带时间序列索引的Dataframe添加匹配特定时间的标记列?
简洁实现时间序列DataFrame的匹配标记列需求
需求说明
现有一个以timestamp为时间序列索引的DataFrame,需要完成以下操作:
- 识别出索引时间为
15:00:00的行 - 添加名为
sigbar的新列,匹配的行赋值为1,不匹配则为0
当前实现步骤繁琐,多次重复引用df['sigbar'],希望得到更简洁的Pythonic写法。
初始DataFrame
open timestamp 2018-08-13 13:00:00 6401.41 2018-08-13 14:00:00 6410.00 2018-08-13 15:00:00 6258.07 2018-08-13 16:00:00 6283.50 2018-08-13 17:00:00 6246.00
预期结果DataFrame
open sigbar timestamp 2018-08-13 13:00:00 6401.41 0 2018-08-13 14:00:00 6410.00 0 2018-08-13 15:00:00 6258.07 1 2018-08-13 16:00:00 6283.50 0 2018-08-13 17:00:00 6246.00 0
当前实现代码(可行但步骤繁琐)
# 创建新列'sigbar'并赋值为索引 df['sigbar'] = df.index # 非15:00:00的行填充为NaT df['sigbar'] = df['sigbar'].at_time('15:00:00', axis=0) # 转换数据类型为int df['sigbar'] = df['sigbar'].values.astype(int) # 非0值转为1 df['sigbar'] = (df.sigbar != 0 ) * 1
简洁实现方案
方案1:直接对比索引时间
提取索引的时间部分,与目标时间对比后转为整数类型,一行完成赋值:
import pandas as pd df['sigbar'] = (df.index.time == pd.to_datetime('15:00:00').time()).astype(int)
方案2:利用at_time生成匹配掩码
先获取所有符合时间条件的索引,再用isin判断每行是否匹配:
target_index = df.at_time('15:00:00').index df['sigbar'] = df.index.isin(target_index).astype(int)
方案3:直接判断时分秒
如果只需要匹配整点15:00,也可以直接提取索引的时分秒进行判断:
df['sigbar'] = ((df.index.hour == 15) & (df.index.minute == 0) & (df.index.second == 0)).astype(int)
内容的提问来源于stack exchange,提问作者Rez
相关产品推荐
相关产品推荐

