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

如何更简洁地为带时间序列索引的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:52:42