
本文介绍如何利用Pandas的between_time和时间索引属性,对具有DatetimeIndex的DataFrame按每日固定时段(如01:35–01:45)或精确时刻(如01:00)进行条件赋值,实现高效、可读性强的时间维度数据标记。
本文介绍如何利用pandas的between_time和时间索引属性,对具有datetimeindex的dataframe按每日固定时段(如01:35–01:45)或精确时刻(如01:00)进行条件赋值,实现高效、可读性强的时间维度数据标记。
在时间序列分析中,常需根据每日相同时段对数据进行统一标记或重置——例如将交易日早盘特定分钟区间设为特殊状态,或将整点时刻作为事件触发点。Pandas 提供了简洁而强大的时间索引操作能力,无需循环或复杂布尔掩码即可完成此类任务。
以下是一个完整、可复现的示例:
import pandas as pd
import numpy as np
# 构建测试数据:9600分钟(约6.7天),频率为1分钟,索引为DatetimeIndex
dates = pd.date_range("20241218", periods=9600, freq='1MIN')
df = pd.DataFrame(np.random.randn(9600, 4), index=dates, columns=list("ABCD"))
# 步骤1:将所有列初始化为0(覆盖原始随机值)
df = pd.DataFrame(0, index=df.index, columns=df.columns)
# 步骤2:对每日 01:35 至 01:45(含)之间的所有行,整行赋值为 -1
df.loc[df.between_time('01:35', '01:45').index] = -1
# 步骤3:对每日精确发生在 01:00:00 的行(即小时=1、分钟=0、秒=0),赋值为 -2
# 注意:使用 df.index.time == pd.Timestamp('01:00').time() 是安全且高效的方式
df.loc[df.index.time == pd.Timestamp('01:00').time()] = -2✅ 关键说明:
-
between_time('01:35', '01:45')默认包含起止时刻(闭区间),适用于跨日不敏感的“每日时段”逻辑; -
df.index.time返回datetime.time对象数组,与pd.Timestamp(...).time()比较可精准匹配时分秒,不受日期影响; - 所有赋值均作用于整行(全部列),因
df.loc[...] = value会广播至所有列; - 建议先初始化全零 DataFrame(如上所示),避免残留原始随机值干扰逻辑。
? 验证结果:
# 查看某一日的 01:35–01:45 区间(前15行)
print(df.between_time('01:35', '01:45').head(15))
# 查看所有 01:00:00 时刻的数据行
print(df.loc[df.index.time == pd.Timestamp('01:00').time()])⚠️ 注意事项:
- 若原始 DataFrame 索引非
DatetimeIndex,需先通过df.index = pd.to_datetime(df.index)转换; -
between_time仅支持TimeSeries类型索引(即 DatetimeIndex 或 PeriodIndex),不适用于普通整数或字符串索引; - 时间字符串格式建议统一使用
'HH:MM'或'HH:MM:SS',避免歧义(如'1:35'在某些版本中可能解析异常,推荐'01:35'); - 若需处理夏令时或不同时区,请显式设置
tz=参数并确保索引已本地化(df.index.tz_localize()/tz_convert())。
该方法兼具性能与可读性,是 Pandas 时间条件填充的标准实践,适用于监控告警标记、周期性信号注入、金融行情过滤等多种场景。

















