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月的销售数据进行趋势分析,并生成直观的图表。
分析需求:
- 计算每日销售额的5日滚动平均值,以平滑日常波动,观察趋势。
- 统计每周销售额在整月总销售额中的占比。
- 绘制“每日销售额”与“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识别日期的格式转换开始,到灵活进行按日期、周期的数据筛选,再到利用重采样进行周期统计,最后通过滚动计算与可视化完成基础的趋势分析。这套组合拳足以覆盖日常数据分析中大部分涉及时序的场景。
时序分析是数据挖掘中的重要基石,无论是未来的库存预测、用户活跃度分析,还是更深层次的时间序列预测模型,都离不开今天所学的这些基础技能。扎实掌握它们,你的数据分析工具箱将更加完备。
相关攻略
今天,咱们来搞定时序数据的核心操作 接续上篇《Pandas 实战八:电商数据案例分析》,这次我们聚焦数据处理中的另一个重要板块:时序数据。掌握了日期格式转换、按周期筛选、统计与趋势分析这几项技能,你就能轻松应对日常工作中绝大多数与时间相关的分析需求了。 什么是时序数据?顾名思义,就是那些带有日期或时
Pandas-Profiling,能一键生成包含统计指标、缺失值、相关性等内容的交互式HTML报告,让探索性数据分析(EDA)效率直接翻倍。 很多同学刚接触数据分析时,习惯用df describe(
OASIS量化交易是一种利用算法和模型自动买卖OASIS代币的策略。它涉及选择策略、建立算法、连接数据源、配置交易平台、优化参数和监控交易等步骤,需要量化交易软件、价格数据、交易平
本站(120btc com):全链互操作协议layerzero由于估值超过30亿美元,成为今年最受期待的空投项目之一。最新在5月初完成第一阶段空投快照,并推出「女巫自行报告计划」大
作者:luccy,区块律动闹了 1 个多月的女巫清洗活动终于结束, LayerZero 基金会今日于 X 宣布已上线空投资格查询页面,然而结果仍然可以用“抠门”形容。作为社区期待度
热门专题
热门推荐
Lemonaid是什么 如果你正为音乐创作寻找得力助手,那么Lemonaid很可能就是答案。它是一款专门面向专业音乐人打造的AI音乐生成工具,核心能力在于自主生成包含完整旋律、和声与节奏的乐曲。无论是想要一段氛围感十足的背景音乐,还是为具体场景定制配乐,它都能提供高度逼真且质量上乘的作品。工具提供了
苹果也要出折叠屏,传闻已经有几年了,从目前供应链、分析师与知名爆料者释放的信息来看,这款与市面大折都不一样的阔折叠似乎已经蓄势待发,大概率今年下半年就要正式面市。今天我们就来为大家汇总一波,没准儿就有你想知道的消息。 关于苹果折叠屏手机的传闻,已经流传了好几年。如今,综合供应链、分析师以及各路知名爆
《刺客信条:黑旗重制版》官宣之际,这款新海盗游戏为何能抢先赢得玩家口碑? 当游戏界的焦点都集中在《刺客信条:黑旗重制版》的正式公布时,一款名为《风启之旅》(Windrose)的开放世界海盗生存建造游戏,却凭借其过硬的品质与独特的玩法融合,悄然在玩家社区中掀起热议。这款由乌兹别克斯坦团队Kraken
产品介绍 提到云端智能视频创作,腾讯智影是一个绕不开的名字。这款由腾讯推出的平台,本质上是一个一站式的在线视频工厂,集成了从素材挖掘、剪辑、渲染到最终发布的全链路功能,旨在为用户提供全方位的视频创作解决方案。更吸引人的是,它不仅免费开放,还深度整合了多项前沿AI技术,目标很明确:让视频化表达这件事,
《王者荣耀世界》线下活动风波:合影互动引争议,职业素养与网络舆论深度探讨 近日,《王者荣耀世界》的一场线下玩家见面会,因台上一次短暂的合影互动,意外成为全网热议的焦点。活动中,一位男粉丝上台与角色扮演者(Coser)合影时,主动做出比心手势以示友好,却未得到身旁Coser的任何回应。男生举着手势在原





