Pandas2.2 DataFrame
Time Series-related
方法 |
描述 |
DataFrame.asfreq(freq[, method, how, …]) |
用于**将时间序列数据转换为指定频率(resample to frequency)**的方法 |
DataFrame.asof(where[, subset]) |
用于查找时间序列中最接近指定时间点的非 NaN 值的方法 |
pandas.DataFrame.asof()
pandas.DataFrame.asof()
是一个用于查找时间序列中最接近指定时间点的非 NaN 值的方法。它常用于金融、时间序列分析中,用于“向前查找”最接近但不晚于给定时间点的数据。
📌 方法签名
DataFrame.asof(where, subset=None)
🔧 参数说明:
参数 |
说明 |
where |
单个时间戳或一维 datetime-like 数组(如 Timestamp , str , datetime ) |
subset |
可选参数,指定在哪些列中进行 as-of 查找;如果不传,则对整个 DataFrame 进行操作 |
⚠️ 注意:索引必须是单调递增的(sorted),否则结果可能不准确!
✅ 返回值
- 如果
where
是单个时间点,返回一个 Series
;
- 如果
where
是多个时间点,返回一个 DataFrame
,其索引为 where
的时间点;
- 每个元素表示在该列中,在不超过
where
时间点的前提下,最后一个非 NaN 值。
🧪 示例代码及结果
示例 1:基本用法(单个时间点)
import pandas as pd
import numpy as np
index = pd.date_range('2025-01-01', periods=5, freq='D')
df = pd.DataFrame({
'A': [10, np.nan, 30, np.nan, 50],
'B': [100, 200, np.nan, 400, 500]
}, index=index)
print("Original DataFrame:")
print(df)
输出:
A B
2025-01-01 10.0 100.0
2025-01-02 NaN 200.0
2025-01-03 30.0 NaN
2025-01-04 NaN 400.0
2025-01-05 50.0 500.0
result = df.asof('2025-01-04')
print("\n.asof('2025-01-04') result:")
print(result)
输出:
A 30.0
B 400.0
Name: 2025-01-04 00:00:00, dtype: float64
示例 2:多个时间点查询
where_times = pd.to_datetime(['2025-01-02', '2025-01-04', '2025-01-06'])
result = df.asof(where_times)
print("\n.asof(['2025-01-02', '2025-01-04', '2025-01-06']) result:")
print(result)
输出:
A B
2025-01-02 10.0 200.0
2025-01-04 30.0 400.0
2025-01-06 50.0 500.0
示例 3:使用 subset
指定列
result = df.asof('2025-01-04', subset=['A'])
print("\n.asof('2025-01-04', subset=['A']) result:")
print(result)
输出:
A 30.0
Name: 2025-01-04 00:00:00, dtype: float64
示例 4:时间点早于所有索引时间的情况
result = df.asof('2024-12-31')
print("\n.asof('2024-12-31') result (before all index):")
print(result)
输出:
A NaN
B NaN
Name: 2024-12-31 00:00:00, dtype: float64
🧠 应用场景
场景 |
说明 |
金融数据查询 |
如查找某个时刻前的最新价格、成交量等 |
时间序列插值 |
在不进行插值的情况下获取最近的有效值 |
事件驱动分析 |
在事件发生前后查找最近的历史数据 |
缺失值处理 |
快速获取最近有效观测值作为替代 |
实时系统回溯 |
获取截止到某一时间点的最新状态 |
⚠️ 注意事项
- 索引必须是
DatetimeIndex
并且是排序好的升序;
- 如果查询的时间早于所有索引时间,返回
NaN
;
- 对于每列来说,会独立查找最后非空值;
- 不会对数据做任何插值或计算,只是取已有数据中“最接近”的那一项。
✅ 总结对比
方法 |
是否基于时间索引 |
是否查找最近非空值 |
是否支持多时间点 |
.asof() |
✅ |
✅ |
✅ |
.loc[] |
✅ |
❌(需精确匹配) |
✅ |
.reindex() |
✅ |
❌(引入 NaN) |
✅ |
.ffill() |
✅ |
✅(整段填充) |
✅ |
如果你希望在时间序列中快速查找每个列在某个时间点前的最后一个有效值,asof()
是非常高效且直观的选择。