游乐游手机版
首页/业界动态/文章详情

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

时间:2026-04-14 18:35
今天,咱们来搞定时序数据的核心操作 接续上篇《Pandas 实战八:电商数据案例分析》,这次我们聚焦数据处理中的另一个重要板块:时序数据。掌握了日期格式转换、按周期筛选、统计与趋势分析这几项技能,你就能轻松应对日常工作中绝大多数与时间相关的分析需求了。 什么是时序数据?顾名思义,就是那些带有日期或时

今天,咱们来搞定时序数据的核心操作

接续上篇《Pandas 实战八:电商数据案例分析》,这次我们聚焦数据处理中的另一个重要板块:时序数据。掌握了日期格式转换、按周期筛选、统计与趋势分析这几项技能,你就能轻松应对日常工作中绝大多数与时间相关的分析需求了。

什么是时序数据?顾名思义,就是那些带有日期或时间戳标识的数据记录。店铺的每日销售额、APP的用户登录日志、气象站的逐小时观测数据、员工的打卡记录,都属于这个范畴。这类数据在日常业务中极为常见,无论是老板要求“统计一下7月份每周的销售额”,还是需要“筛选出3月10日到20日的用户行为数据”,用Pandas来处理,效率通常比Excel高出不止一个量级,即便是新手也能快速上手。

一、先搞懂:时序数据的“基础操作”

处理时序数据,第一步往往不是直接分析,而是要先教会Pandas“认识”日期。道理很简单,我们拿到的原始数据里,日期列常常是字符串格式(比如“2024-07-01”),这种格式无法直接进行基于时间的筛选或计算。所以,首当其冲的任务便是「日期格式转换」。

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

先模拟一份“店铺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](日期类型)

2. 进阶:把日期设为“索引”

有一个好习惯能让后续操作事半功倍:将日期列设置为数据框的索引。这样做之后,基于时间的筛选、切片和重采样都会变得异常简洁直观,强烈建议新手掌握。

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

运行这段代码,你会看到日期列移到了数据最左侧的索引位置,整个数据结构看起来一目了然。

二、核心技能1:按日期筛选

基于时间进行数据筛选,是时序分析中最高频的需求之一。例如,“找出7月5日之后的所有记录”或“筛选出每周一的数据”。下面三个场景覆盖了大部分常见情况,可以直接套用。

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

# 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)

场景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)

场景3:按“季度/星期”筛选

# 筛选第三季度(7-9月)的数据
df_q3 = df[df["date"].dt.quarter == 3]
# 筛选工作日(周一到周五)的数据
df_workday = df[df["date"].dt.weekday < 5]
print("第三季度数据:")
print(df_q3.head())

三、核心技能2:时序数据统计

业务中常有按周期汇总统计的需求,例如“计算每周销售总额”或“查看每月的平均客流量”。Pandas的 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)

运行后,数据会自动按设定的周期分组。例如,输出结果中的“2024-07-07”代表从当周开始到该周日(默认一周的结束)的数据总和,无需手动拆分,非常便捷。

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

掌握了基础操作,我们通过一个完整的实战案例来巩固一下——利用7月的销售数据进行趋势分析,并生成直观的图表。

分析需求:

  1. 计算每日销售额的5日滚动平均值,以平滑日常波动,观察趋势。
  2. 统计每周销售额在整月总销售额中的占比。
  3. 绘制“每日销售额”与“5日滚动平均”的对比折线图。
# 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)  # 占比保留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. 日期格式不统一

原始数据中可能存在混合格式,如“2024-07-01”和“2024/07/01”。这时使用 pd.to_datetime() 时可以加上 errors="coerce" 参数,无法转换的条目会变成NaT(缺失时间),从而避免程序报错中断。

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

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

需要留意不同操作下的区间定义。使用索引切片如 df_indexed["2024-07-01":"2024-07-05"] 是“左闭右闭”的,即包含7月5日。而 resample("W") 默认以周日作为一周的结束点。进行关键分析时,最好确认一下周期范围是否符合业务定义。

3. 缺失日期补全

如果数据在某个日期有缺失(比如7月6日没有记录),为了保持时间序列的连续性进行分析,可以先补全日期序列,再用0或其他方法填充缺失值。

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

六、总结

综上所述,我们今天系统地梳理了时序数据处理的核心链条:从让Pandas识别日期的格式转换开始,到灵活进行按日期、周期的数据筛选,再到利用重采样进行周期统计,最后通过滚动计算与可视化完成基础的趋势分析。这套组合拳足以覆盖日常数据分析中大部分涉及时序的场景。

时序分析是数据挖掘中的重要基石,无论是未来的库存预测、用户活跃度分析,还是更深层次的时间序列预测模型,都离不开今天所学的这些基础技能。扎实掌握它们,你的数据分析工具箱将更加完备。

来源:https://www.51cto.com/article/835478.html
上一篇Swift 6.2 彻底改变了游戏规则, 正在悄悄改写整个 iOS 开发生态 下一篇Pandas3.0 太猛了!不用改一行代码,数据处理速度直接飙五倍
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
九号N1机甲风电动车发布 模拟声浪轻量化车架3499元起
业界动态 · 2026-05-29

九号N1机甲风电动车发布 模拟声浪轻量化车架3499元起

九号发布N1机甲风电动车系列,三款起售价3499元。N170极速47km h,轻量化车架;N185极速55km h,可选模拟声浪;旗舰N190极速60km h,标配模拟声浪及双通道ABS,7月上市。

九号2026新品发布会最强阵容连发4款新车重新定义好车标准
业界动态 · 2026-05-29

九号2026新品发布会最强阵容连发4款新车重新定义好车标准

九号公司发布2026年新品,推出N1、M1、M3及Fz5四款新车,覆盖电摩与电自领域。N1主打短轴距声光电酷玩体验,M1配备双通道ABS与100公里真续航,M3下放AXC车架技术,Fz5首搭载双向转把功能。同时推出3年原厂换新质保等用户权益。

世界超级摩托车锦标赛阿拉贡站张雪机车超级杆位赛获亚军
业界动态 · 2026-05-29

世界超级摩托车锦标赛阿拉贡站张雪机车超级杆位赛获亚军

5月29日,世界超级摩托车锦标赛(WSBK)阿拉贡站传来一则引人瞩目的消息——中国摩托车制造商“张雪机车”旗下的法国车手瓦伦丁·德比斯,在WorldSSP组别的超级杆位赛中成功夺得第二名。 先简要科普一下赛事背景:世界超级摩托车锦标赛(WSBK)是由国际摩托车联合会于1988年创立的顶级公路摩托车赛

英雄联盟海克斯大乱斗重大更新 移除羁绊新增技能符文
业界动态 · 2026-05-29

英雄联盟海克斯大乱斗重大更新 移除羁绊新增技能符文

英雄联盟海克斯大乱斗将在26 12版本移除羁绊系统,上线技能符文体系。该符文能重构技能释放逻辑,实现布里茨钩五人、拉克丝定全队等效果。部分原有羁绊效果转为独立专属符文,更新预计2026年6月中旬登陆国服。

领克10/10+正式上市限时价16.99-23.59万号称弯道之王
业界动态 · 2026-05-29

领克10/10+正式上市限时价16.99-23.59万号称弯道之王

```html 5月29日晚间,领克终于将其备受关注的中大型运动纯电轿车正式推向市场——领克10与领克10+同步上市,官方直接打出“弯道之王”的旗号。我们先不深究它是否真能“弯道超车”,单从价格来看,就已经颇具冲击力。 先奉上一张价格速览表,让大家心里有个底: 领克 10 701 长续航 Max:指