
本文介绍如何利用Pandas的between_time和时间索引属性,对具有DatetimeIndex的DataFrame按每日固定时间段(如01:35–01:45)或精确时刻(如01:00)进行高效、向量化列填充。
本文介绍如何利用pandas的between_time和时间索引属性,对具有datetimeindex的dataframe按每日固定时间段(如01:35–01:45)或精确时刻(如01:00)进行高效、向量化列填充。
在处理高频时间序列数据(如分钟级金融行情、传感器日志)时,常需根据一天内的特定时段对整行或多列统一赋值。Pandas 提供了简洁而高效的原生方法,无需循环或apply,即可实现基于时间条件的批量填充。
以下为完整实现步骤(基于您生成的示例数据):
import pandas as pd
import numpy as np
# 构建测试数据:9600分钟(约6.67天),频率为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=dates, columns=list("ABCD"))
# 步骤2:对每日 01:35 至 01:45(含)之间的所有行,将全部列设为 -1
# 注意:between_time 默认包含边界,且自动适配每日重复时段
df.loc[df.between_time('01:35', '01:45').index] = -1
# 步骤3:对每日恰好为 01:00:00 的行(即每小时整点),将全部列设为 -2
# 使用 index.time 与 pd.Timestamp().time() 比较,确保类型一致
target_time = pd.Timestamp('01:00').time()
df.loc[df.index.time == target_time] = -2
✅ 关键说明:
-
df.between_time(start, end)返回一个视图(view),其索引是原始DataFrame中满足“当日时间 ∈ [start, end]”的所有行索引,适用于跨多日的周期性时段匹配; -
df.index.time返回numpy.ndarrayofdatetime.time对象,可直接与pd.Timestamp(...).time()安全比较; - 赋值语句
df.loc[...] = value是向量化操作,性能远优于逐行遍历; - 所有赋值均作用于全部列(
df.loc[rows, :]隐式生效),无需显式指定列名。
? 验证建议:
# 查看某一日的 01:35–01:45 区间(前15行)
print("01:35–01:45 区间样本:")
print(df.between_time('01:35', '01:45').head(15))
# 查看所有 01:00:00 的行(通常每天1行)
print("\n所有 01:00:00 行:")
print(df.loc[df.index.time == pd.Timestamp('01:00').time()])
⚠️ 注意事项:
-
between_time仅适用于DatetimeIndex或PeriodIndex;若索引为普通RangeIndex或object类型,需先用df.set_index('datetime_col')设置时间索引; - 时间字符串格式支持
'HH:MM'、'HH:MM:SS',不区分大小写,但推荐统一使用24小时制; - 若需排除边界(如开区间),需结合布尔索引手动构造,例如:
mask = (df.index.time > pd.Timestamp('01:35').time()) & (df.index.time ; - 对于非标准时区数据,请确保索引已正确本地化(
.dt.tz_localize()/.dt.tz_convert()),否则between_time可能行为异常。
通过以上方法,您可在毫秒级完成数万行时间序列的条件填充,兼顾代码可读性与运行效率。










