
本文介绍如何基于时间条件(如特定时间段或精确时刻)对 Pandas DataFrame 的所有数值列进行高效、批量赋值,涵盖 between_time 和 index.time 的正确用法及常见陷阱。
本文介绍如何基于时间条件(如特定时间段或精确时刻)对 pandas dataframe 的所有数值列进行高效、批量赋值,涵盖 `between_time` 和 `index.time` 的正确用法及常见陷阱。
在时间序列分析中,常需根据时间特征(如每日固定时段)统一修改数据。例如,将每日 01:35–01:45 的所有列设为 -1,将每日整点 01:00 的所有行设为 -2,其余位置初始化为 0。关键在于避免循环、利用向量化操作,并准确处理 DatetimeIndex 的时间提取逻辑。
首先构建示例数据:
import pandas as pd
import numpy as np
dates = pd.date_range("20241218", periods=9600, freq='1MIN')
df = pd.DataFrame(np.random.randn(9600, 4), index=dates, columns=list("ABCD"))
接着,按需求分步填充:
-
全局初始化为 0(确保默认状态明确):
df = pd.DataFrame(0, index=dates, columns=list("ABCD")) -
填充时间段(01:35–01:45):
使用between_time()提取每日该时段的行索引,注意其默认包含边界(闭区间),且要求索引为DatetimeIndex(本例满足):df.loc[df.between_time('01:35', '01:45').index] = -1 -
填充精确时刻(01:00:00):
between_time不支持单点匹配,应改用index.time配合pd.Timestamp(...).time()进行等值比较:df.loc[df.index.time == pd.Timestamp('01:00').time()] = -2
✅ 验证示例:
# 查看 01:35–01:45 区间前15行(应全为-1)
print(df.between_time('01:35', '01:45').head(15))
# 查看所有 01:00:00 行(应全为-2)
print(df.loc[df.index.time == pd.Timestamp('01:00').time()])
⚠️ 注意事项:
-
between_time()对freq='1MIN'数据有效,但若索引含秒/毫秒级精度,需确保时间字符串格式一致(如'01:35:00'); -
df.index.time返回datetime.time对象数组,pd.Timestamp('01:00').time()是安全的转换方式,不可直接用字符串'01:00'比较; - 若 DataFrame 含非数值列,建议先筛选
df.select_dtypes(include=np.number)再赋值,避免类型错误; - 性能敏感场景下,上述
.loc[...] = value是原地操作,比np.where或apply更高效。
通过组合 between_time 与 index.time,即可精准、简洁地实现多粒度时间条件填充,是 Pandas 时间序列预处理的核心技巧之一。










