8. Pandas 日期与时间序列数据处理
Pandas 日期与时间序列数据处理
时间序列数据广泛应用于 金融交易、销售分析、交通流量、气象研究 等领域。Pandas 提供了强大的日期与时间处理能力,包括日期类型转换、日期属性提取、时间索引设置、重采样与滚动计算等功能。本文通过实例演示这些操作,帮助你快速掌握时间序列分析的基础技能。
1. 日期转换(.to_datetime)
在数据集中,日期常以字符串或数值形式存在,需要先转换为 Pandas 的日期时间类型:
import pandas as pddata = {"日期": ["2025-01-01", "2025-01-05", "2025-01-10", "2025-01-15"],"销售额": [100, 150, 200, 130]
}df = pd.DataFrame(data)df['日期'] = pd.to_datetime(df['日期']) # 转换为 datetime 类型
print(df.dtypes)
print(df)
日期 datetime64[ns]
销售额 int64
dtype: object日期 销售额
0 2025-01-01 100
1 2025-01-05 150
2 2025-01-10 200
3 2025-01-15 130
2. 提取日期属性(.dt)
利用 .dt
可以直接提取日期的年、月、日、周、季度等信息:
df['年'] = df['日期'].dt.year
df['月'] = df['日期'].dt.month
df['日'] = df['日期'].dt.day
df['周'] = df['日期'].dt.isocalendar().week
df['季度'] = df['日期'].dt.quarterprint(df)
日期 销售额 年 月 日 周 季度
0 2025-01-01 100 2025 1 1 1 1
1 2025-01-05 150 2025 1 5 1 1
2 2025-01-10 200 2025 1 10 2 1
3 2025-01-15 130 2025 1 15 3 1
dt.strftime(“%Y-%m-%d”) 可以灵活格式化日期,例如生成 “2025年1月5日” 这样的字符串。
3. 时间索引与重采样(resample)
设置日期列为索引后,可对时间序列进行重采样和聚合分析。
df.set_index('日期', inplace=True)
print(df)
销售 年 月 日 周 季度
日期
2025-01-01 100 2025 1 1 1 1
2025-01-05 150 2025 1 5 1 1
2025-01-10 200 2025 1 10 2 1
2025-01-15 130 2025 1 15 3 1
3.1 重采样与聚合
# 按周求销售额总和
weekly_sales = df['销售额'].resample('W').sum()
print("按周汇总销售额:\n", weekly_sales)# 按月求平均销售额
monthly_sales = df['销售额'].resample('M').mean()
print("\n按月平均销售额:\n", monthly_sales)
按周汇总销售额:日期
2025-01-05 250
2025-01-12 200
2025-01-19 130
Freq: W-SUN, Name: 销售额, dtype: int64按月平均销售额:日期
2025-01-31 145.0
Freq: ME, Name: 销售额, dtype: float64
常用重采样频率:
D
:天W
:周M
:月Q
:季度Y
:年H
:小时T
或min
:分钟
3.2 填充缺失时间
重采样可能会出现缺失值,可以用前向/后向填充:
# 按天重采样,缺失值前向填充
daily_sales = df['销售额'].resample('D').sum().fillna(method='ffill')
print("按天重采样并填充缺失值:\n", daily_sales)
按天重采样并填充缺失值:日期
2025-01-01 100
2025-01-02 0
2025-01-03 0
2025-01-04 0
2025-01-05 150
2025-01-06 0
2025-01-07 0
2025-01-08 0
2025-01-09 0
2025-01-10 200
2025-01-11 0
2025-01-12 0
2025-01-13 0
2025-01-14 0
2025-01-15 130
Freq: D, Name: 销售额, dtype: int64
4. 时间差与滚动计算
4.1 时间差计算
df1 = pd.DataFrame(df['销售额'])df1['前一日销售额'] = df['销售额'].shift(1)
df1['销售额变化'] = df['销售额'] - df['前一日销售额']
print(df1)
销售额 前一日销售额 销售额变化
日期
2025-01-01 100 NaN NaN
2025-01-05 150 100.0 50.0
2025-01-10 200 150.0 50.0
2025-01-15 130 200.0 -70.0
shift()
可对比任意滞后期,例如shift(7)
可用于 同比/环比分析。
4.2 滚动窗口计算
# 3日移动平均
df['3日均值'] = df['销售额'].rolling(window=3).mean()
print(df)
销售额 前一日销售额 销售额变化 3日均值
日期
2025-01-01 100 NaN NaN NaN
2025-01-05 150 100.0 50.0 NaN
2025-01-10 200 150.0 50.0 150.0
2025-01-15 130 200.0 -70.0 160.0
常见滚动函数:
mean()
、sum()
、max()
、min()
、std()
。
5. 小结
- 日期转换:
pd.to_datetime
将字符串/数值转换为日期类型。 - 日期属性提取:
.dt
可获取年、月、日、周、季度等信息,支持格式化输出。 - 时间索引与重采样:通过
resample
可按日、周、月等周期聚合数据,并支持缺失值填充。 - 时间差与滚动计算:可计算增量或移动均值,辅助趋势分析与预测。
时间序列处理是 金融市场预测、零售趋势分析、交通流量监测、气象建模 等领域的核心技能。熟练掌握这些方法,能让数据分析更高效、更有洞察力。