Pandas2.2 DataFrame
Time Series-related
方法 | 描述 |
---|
DataFrame.asfreq(freq[, method, how, …]) | 用于**将时间序列数据转换为指定频率(resample to frequency)**的方法 |
pandas.DataFrame.asfreq()
pandas.DataFrame.asfreq()
是一个用于**将时间序列数据转换为指定频率(resample to frequency)**的方法。它常用于处理 DatetimeIndex
类型的 DataFrame 或 Series,可以改变索引的时间频率,并在必要时插入缺失值或使用指定方法填充。
📌 方法签名
DataFrame.asfreq(freq, method=None, how=None, normalize=False, fill_value=None)
🔧 参数说明:
参数 | 说明 |
---|
freq | 目标频率字符串,如 'D' (天)、'W' (周)、'M' (月)、'Q' (季度)、'A' (年)等 |
method | 填充方法,可选 'backfill' /'bfill' (后向填充)或 'pad' /'ffill' (前向填充) |
how | 对齐方式,可选 'start' 或 'end' (主要用于多周期对齐) |
normalize | 是否将时间戳标准化为午夜时间(00:00:00),默认 False |
fill_value | 用于填充新引入的 NaN 值,默认为 NaN |
✅ 返回值
- 返回一个新的 DataFrame 或 Series,其索引被调整为目标频率
freq
; - 原始数据不会被修改(除非使用
inplace=True
);
🧪 示例代码及结果
示例 1:基本用法(按日频率转换)
import pandas as pd
import numpy as np
index = pd.date_range('2025-01-01', periods=4, freq='2D')
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)print("Original DataFrame:")
print(df)
输出:
value
2025-01-01 10
2025-01-03 20
2025-01-05 30
2025-01-07 40
df_daily = df.asfreq('D')
print("\nAfter .asfreq('D'):")
print(df_daily)
输出:
value
2025-01-01 10.0
2025-01-02 NaN
2025-01-03 20.0
2025-01-04 NaN
2025-01-05 30.0
2025-01-06 NaN
2025-01-07 40.0
示例 2:使用前向填充(method='ffill'
)
df_daily_ffill = df.asfreq('D', method='ffill')
print("\nAfter .asfreq('D', method='ffill'):")
print(df_daily_ffill)
输出:
value
2025-01-01 10
2025-01-02 10
2025-01-03 20
2025-01-04 20
2025-01-05 30
2025-01-06 30
2025-01-07 40
示例 3:使用后向填充(method='bfill'
)
df_daily_bfill = df.asfreq('D', method='bfill')
print("\nAfter .asfreq('D', method='bfill'):")
print(df_daily_bfill)
输出:
value
2025-01-01 10
2025-01-02 20
2025-01-03 20
2025-01-04 30
2025-01-05 30
2025-01-06 40
2025-01-07 40
示例 4:设置填充数值(fill_value=0
)
df_daily_fill0 = df.asfreq('D', fill_value=0)
print("\nAfter .asfreq('D', fill_value=0):")
print(df_daily_fill0)
输出:
value
2025-01-01 10
2025-01-02 0
2025-01-03 20
2025-01-04 0
2025-01-05 30
2025-01-06 0
2025-01-07 40
示例 5:标准化时间戳(normalize=True
)
df_normalize = df.asfreq('D', normalize=True)
print("\nAfter .asfreq('D', normalize=True):")
print(df_normalize)
此操作会将所有时间戳设为当天的 00:00:00,适用于统一时间格式。
🧠 应用场景
场景 | 说明 |
---|
时间序列对齐 | 将不同频率的数据统一到相同频率进行比较 |
缺失值插补 | 使用 method='ffill' 或 method='bfill' 插入缺失数据 |
可视化准备 | 统一时间间隔便于绘图 |
模型输入预处理 | 确保时间序列是规则频率,便于建模 |
数据清洗 | 标准化时间戳、填充空缺日期 |
⚠️ 注意事项
asfreq()
不会自动聚合数据(与 resample()
不同),仅重采样;- 若目标频率比原始频率更细粒度,会引入
NaN
; - 若目标频率比原始频率更粗粒度,则只保留原数据点;
method
和 fill_value
只能二选一,不能同时使用;asfreq()
更适合已知数据点不变的情况下做频率转换。
✅ 对比 asfreq()
vs resample()
特性 | asfreq() | resample() |
---|
是否聚合 | ❌ | ✅ |
频率控制 | 设置固定频率 | 支持分组聚合 |
插值方式 | 支持 ffill/bfill | 需要调用 .interpolate() |
更适合 | 时间序列对齐 | 时间窗口统计分析 |
是否保留原始数据 | ✅ | ❌(需聚合) |
如果你希望保持原始数据不变,仅调整时间频率并填充缺失值,那么 asfreq()
是非常合适的选择。