Pandas 实战九:时序数据处理,日期筛选/统计分析一看就会

作者:互联网

2026-03-24

AI模型库

接上篇《Pandas 实战八:电商数据案例分析,从数据提取到可视化全流程

什么是时序数据?简单说就是带日期/时间戳的数据,比如店铺每日销售额、APP用户登录日志、气象站 hourly 观测数据、打卡记录等。这类数据日常工作中超常见,比如老板让你“统计7月份每周的销售额”“筛选出3月10日-3月20日的用户行为”,用Pandas处理起来比Excel快10倍,新手也能轻松拿捏!

一、先搞懂:时序数据的“基础操作”(避免踩坑)

处理时序数据的第一步,是让Pandas“认识”日期——很多时候我们拿到的数据,日期是字符串格式(比如"2024-07-01"),没法直接按日期筛选,所以先学「日期格式转换」。

1. 准备数据+转换日期格式

先模拟一份“店铺7月销售数据”(新手直接复制代码就能跑):

import pandas as pd
import matplotlib.pyplot as plt  # 后续可视化用

# 模拟数据:日期(字符串格式)、销售额、客流量
data = {
    "date": ["2024-07-01", "2024-07-02", "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](日期类型)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

2. 进阶:把日期设为“索引”(更方便操作)

将日期列设为索引后,筛选、统计会更简洁,新手建议养成这个习惯:

df_indexed = df.set_index("date")  # 把date列设为索引
print("设为索引后的数据:")
print(df_indexed.head())  # 显示前5
  • 1.
  • 2.
  • 3.

运行结果会看到,日期跑到了最左边(索引列),后续操作更直观~

二、核心技能1:按日期筛选(新手最常用)

筛选时序数据的场景太多了!比如“筛选7月5日之后的数据”“筛选每周一的记录”,下面是3个高频场景,直接套用就行:

场景1:按“具体日期/时间段”筛选

# 1. 筛选单个日期(比如2024-07-08)
df_0708 = df[df["date"] == "2024-07-08"]
print("7月8日数据:")
print(df_0708)

# 2. 筛选时间段(比如75-710日)
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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

场景2:按“年/月/日”筛选(比如筛选7月份所有数据)

# 筛选7月份的数据(不管年份,只看月份)
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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

场景3:按“季度/星期”筛选(进阶)

# 筛选第三季度(7-9月)的数据
df_q3 = df[df["date"].dt.quarter == 3]

# 筛选工作日(周一到周五)的数据
df_workday = df[df["date"].dt.weekday < 5]

print("第三季度数据:")
print(df_q3.head())
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

三、核心技能2:时序数据统计(按周期汇总)

统计需求比如“按日/周/月统计销售额总和”“计算每周平均客流量”,用resample()函数一键搞定,新手记好这几个常用周期就行:

  • 日:D(Day)
  • 周:W(Week)
  • 月:M(Month)
  • 季度:Q(Quarter)

示例:按周/月统计销售数据

# 先确保日期是索引(否则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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

运行结果会自动按周期分组,比如“2024-07-07”代表第一周(截至周日),不用自己手动分组,超方便!

四、实战案例:分析7月销售趋势

学完基础操作,咱们来个完整实战——用7月销售数据做“趋势分析”,还能生成简单图表(新手也能跟着跑):

需求:

  • 计算7月每日销售额的滚动平均值(5日滚动,平滑波动);
  • 统计每周销售额占比;
  • 绘制“每日销售额+滚动平均值”折线图。
# 1. 计算5日滚动平均值(窗口大小=5,即当前日期前后2天的平均)
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)  # 占比保留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()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

运行后会弹出一个折线图,能清晰看到每日销售额的波动和整体趋势,滚动平均值还能帮我们排除偶然波动,找到真实趋势~

五、新手避坑指南(3个常见问题)

1. 日期格式不统一

比如数据里有"2024-07-01"和"2024/07/01",用pd.to_datetime()时加errors="coerce",无法转换的会变成NaT(缺失日期),避免报错:

df["date"] = pd.to_datetime(df["date"], errors="coerce")
  • 1.

2. 筛选时“左闭右开”?

用索引切片df_indexed["2024-07-01":"2024-07-05"]是左闭右闭(包含7月5日),但resample("W")默认以周日为一周结束,记得确认周期范围。

3. 缺失日期补全

如果数据有缺失(比如7月6日没记录),用resample("D").asfreq()补全日期,缺失值用fillna(0)填充:

df_complete = df_indexed.resample("D").asfreq().fillna(0)
  • 1.

六、总结

今天咱们学会了时序数据的核心操作:日期格式转换、按日期/周期筛选、时序统计和趋势分析,这些技能足够应对日常工作中的大部分场景啦!

时序数据是数据分析的重要分支,比如后续做库存预测、用户活跃度分析,都离不开这些基础。

相关标签:

AI 大模型 资讯