Pandas时序数据处理:从格式转换到趋势分析的核心操作 承接《Pandas实战八:电商数据案例
承接《Pandas实战八:电商数据案例分析》,本篇深入数据处理的关键领域:时间序列。掌握日期格式标准化、周期筛选、聚合统计与趋势分析这四项核心技能,你将能高效解决业务中绝大多数与时间维度相关的分析需求。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
时序数据指任何带有时间戳标识的数据记录,例如每日销售额、用户登录日志、气象观测数据或员工考勤记录。这类数据在业务分析中无处不在,无论是管理层需要“统计Q3各周销售表现”,还是业务方提出“提取特定促销周期的用户行为数据”,Pandas的处理效率远超Excel,其清晰的语法逻辑让初学者也能快速产出可靠结果。

处理时序数据的首要步骤,是确保Pandas能够正确解析日期字段。原始数据中的日期列通常以字符串格式存储(如“2024-07-01”),这种格式无法直接用于时间序列计算。因此,我们的第一个关键操作就是执行「日期格式转换」。
我们以一份模拟的“店铺7月销售数据”为例,以下代码可直接运行:
import pandas as pd
import matplotlib.pyplot as plt # 后续可视化用
# 模拟数据:日期(字符串格式)、销售额、客流量
data = {
"date": ["2024-07-01", "2024-07-02", "2024-2024-07-03", "2024-07-04",
"2024-07-05", "2024-07-06", "2024-07-07", "2024-07-08",
"2024-07-09", "2024-07-10", "2024-07-11", "2024-07-12",
"2024-07-13", "2024-07-14", "2024-07-15"], # 15天数据
"sales": [5200, 4800, 6100, 5500, 7200, 8300, 6900, 5800,
6500, 7100, 6300, 5900, 7800, 8200, 7500],
"customers": [120, 110, 135, 125, 150, 170, 145, 130,
140, 155, 138, 128, 165, 172, 158]
}
df = pd.DataFrame(data)
print("转换前日期类型:", df["date"].dtype) # 输出:object(字符串类型)
# 核心操作:将字符串日期转换为Pandas的datetime类型
df["date"] = pd.to_datetime(df["date"])
print("转换后日期类型:", df["date"].dtype) # 输出:datetime64[ns](日期类型)
一个提升后续操作效率的最佳实践是将日期列设置为DataFrame的索引。设置索引后,基于时间的切片、筛选和重采样操作会变得异常简洁,强烈建议在时序分析中优先采用。
df_indexed = df.set_index("date") # 把date列设为索引
print("设为索引后的数据:")
print(df_indexed.head()) # 显示前5行
运行代码后,日期列将移至最左侧的索引位置,数据结构一目了然,为后续的时间序列分析奠定基础。
按时间维度筛选数据是时序分析中最频繁的需求。无论是提取特定日期范围的数据,还是按星期、月份进行条件过滤,以下三种场景覆盖了绝大部分实际应用。
场景一:按具体日期或时间段筛选
# 1. 筛选单个日期(例如2024-07-08)
df_0708 = df[df["date"] == "2024-07-08"]
print("7月8日数据:")
print(df_0708)
# 2. 筛选一个时间段(例如7月5日至7月10日)
df_period = df[(df["date"] >= "2024-07-05") & (df["date"] <= "2024-07-10")]
print("\n7月5日-10日数据:")
print(df_period)
# 3. 使用日期索引进行筛选(语法更简洁)
df_indexed_period = df_indexed["2024-07-05":"2024-07-10"] # 切片语法,左闭右闭
print("\n索引筛选时间段:")
print(df_indexed_period)
场景二:按年、月、日层级筛选
例如,需要筛选出所有7月份的数据,而不考虑具体年份。
# 筛选所有月份为7月的数据(dt.month属性)
df_july = df[df["date"].dt.month == 7]
# 筛选所有周一的数据(dt.weekday:0代表周一,6代表周日)
df_monday = df[df["date"].dt.weekday == 0]
print("7月份数据总行数:", len(df_july))
print("周一的数据:")
print(df_monday)
场景三:按季度或星期类型筛选
# 筛选第三季度(7-9月)的数据
df_q3 = df[df["date"].dt.quarter == 3]
# 筛选所有工作日(周一至周五)的数据
df_workday = df[df["date"].dt.weekday < 5]
print("第三季度数据:")
print(df_q3.head())
业务分析中经常需要按固定周期汇总数据,例如计算每周销售总额或月度平均客流量。Pandas的 resample() 方法是处理这类需求的利器。掌握以下常用周期频率代码即可:
示例:按周和月进行销售数据统计
# 首先确保日期列是索引(resample方法要求)
df_indexed = df.set_index("date")
# 1. 按周聚合:计算每周销售额与客流量的总和
weekly_stats = df_indexed.resample("W").sum()
print("每周统计数据:")
print(weekly_stats)
# 2. 按周聚合:计算每周销售额与客流量的平均值
weekly_mean = df_indexed.resample("W").mean()
print("\n每周平均数据:")
print(weekly_mean)
# 3. 按月聚合:计算7月份的总销售额与总客流量
monthly_stats = df_indexed.resample("M").sum()
print("\n7月份总数据:")
print(monthly_stats)
运行后,数据将按指定周期自动分组。输出结果中的“2024-07-07”代表从当周开始到该周日(默认一周结束点)的聚合数据,无需手动拆分,极大提升了分析效率。
整合以上技能,我们通过一个完整的案例进行巩固——分析7月销售趋势,并生成可视化图表。
分析目标:
# 1. 计算5日滚动平均值(窗口大小为5,计算包含当天及前后临近几天的均值)
df_indexed["sales_roll_5d"] = df_indexed["sales"].rolling(window=5).mean()
print("带滚动平均值的数据:")
print(df_indexed[["sales", "sales_roll_5d"]].head(10))
# 2. 统计每周销售额占比
weekly_sales = df_indexed.resample("W")["sales"].sum()
weekly_ratio = (weekly_sales / weekly_sales.sum() * 100).round(2) # 占比保留两位小数
print("\n每周销售额占比(%):")
print(weekly_ratio)
# 3. 绘制趋势对比图
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.figure(figsize=(10, 5))
plt.plot(df_indexed.index, df_indexed["sales"], label="每日销售额", marker="o")
plt.plot(df_indexed.index, df_indexed["sales_roll_5d"], label="5日滚动平均", color="red", linewidth=2)
plt.xlabel("日期")
plt.ylabel("销售额(元)")
plt.title("2024年7月店铺销售额趋势分析")
plt.legend()
plt.grid(alpha=0.3) # 添加半透明网格线,增强可读性
plt.show()
执行代码将生成清晰的折线图。图中蓝色折线展示每日销售额的具体波动,红色趋势线则通过滚动平均过滤随机噪声,清晰呈现销售额的整体走向,这是进行有效趋势分析的核心。
最后,汇总几个初学者常遇到的陷阱及其解决方案,助你规避常见错误。
原始数据中可能混用“2024-07-01”和“2024/07/01”等多种格式。使用 pd.to_datetime() 时,添加 errors="coerce" 参数可将无法解析的条目转为NaT(缺失时间),避免整个转换过程因格式错误而中断。
df["date"] = pd.to_datetime(df["date"], errors="coerce")
需注意不同操作对时间区间包含性的定义差异。使用索引切片如 df_indexed["2024-07-01":"2024-07-05"] 是“左闭右闭”区间,包含7月5日。而 resample("W") 默认以周日作为周期终点。在进行关键业务分析时,务必确认周期边界是否符合业务逻辑。
若时间序列存在日期缺失(例如7月6日无记录),为了进行连续的时序分析,可先补全完整的日期序列,再用0或插值法填充缺失值。
df_complete = df_indexed.resample("D").asfreq().fillna(0)
至此,我们系统性地掌握了Pandas处理时序数据的完整流程:从基础的日期格式转换与索引设置,到灵活的时间段筛选与周期条件过滤,再到利用重采样进行高效的聚合统计,最后通过滚动计算与可视化完成初步的趋势洞察。这套方法能应对绝大多数日常业务中的时序数据分析场景。
时序分析是数据挖掘与业务洞察的基石,无论是库存预测、用户活跃度分析,还是构建更复杂的时间序列预测模型,都离不开这些基础而强大的操作。熟练掌握它们,你的数据分析能力将迈上一个新的台阶。
菜鸟下载发布此文仅为传递信息,不代表菜鸟下载认同其观点或证实其描述。