【Pandas】pandas DataFrame asof

发布于:2025-06-26 ⋅ 阅读:(15) ⋅ 点赞:(0)

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

# 创建带时间索引的 DataFrame
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
# 查询最接近 '2025-01-04' 的每一列的 asof 值
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 指定列
# 只对列 'A' 进行 asof 查询
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() 是非常高效且直观的选择。


网站公告

今日签到

点亮在社区的每一天
去签到