玩转Pandas时间序列:从入门到精通,数据分析师必备核心技能

张开发
2026/5/23 15:05:35 15 分钟阅读
玩转Pandas时间序列:从入门到精通,数据分析师必备核心技能
学会与时间对话你的数据会说话在数据分析的世界里时间无处不在。从股票价格、天气预报到用户行为日志、销售记录几乎所有的数据都带有时间的烙印。如何高效地处理、分析和可视化这些时间数据是每一位数据分析师的必备技能。在Python的数据生态中Pandas库提供了强大且灵活的时间序列处理能力。今天我们就来深入拆解Pandas时间序列的方方面面让你从入门到精通真正掌握与时间对话的能力。一、初识时间Python的datetime模块在接触Pandas之前我们先来认识一下Python的“亲儿子”——datetime模块。它是Python标准库的一部分提供了最基本的日期和时间功能。from datetime import datetime # 创建一个特定的日期时间对象 date1 datetime(year2000, month1, day1) # 获取当前日期时间 date2 datetime.now() print(date1) # 输出: 2000-01-01 00:00:00 print(date2) # 输出: 2025-01-01 00:00:00 (假设今天是2025年1月1日)datetime对象非常直观我们可以轻松地获取年月日、星期几等信息甚至还能进行日期加减运算。print(date1.year) # 2000 print(date1.month) # 1 print(date1.day) # 1 print(date2.weekday()) # 5 (注意周一为0周日为6所以5代表周六) print(date2.strftime(%A)) # Saturday (将星期几格式化为英文全称) print(date2 - date1) # 18263 days, 0:00:00 (两个日期相差的天数)datetime模块虽然好用但当我们面对成千上万、甚至百万级的时间数据时它的处理速度就显得捉襟见肘了。这时我们需要Pandas这位“重量级选手”登场。二、Pandas时间三剑客Timestamp、Period与TimedeltaPandas针对时间数据设计了三种核心类型它们分别对应了不同的时间概念我们称之为“Pandas时间三剑客”。1. Timestamp瞬间的“时间戳”Timestamp是Pandas中最基础的时间类型它代表了一个具体的时间点。你可以把它看作是Python datetime的“增强版”性能更高功能更丰富。它基于NumPy的datetime64[ns]数据类型构建能够精确到纳秒级别。当你用pd.to_datetime()处理一个单独的日期字符串时得到的就是一个Timestamp对象。import pandas as pd # 解析单个日期字符串 print(pd.to_datetime(2015-01-01)) # 输出: 2015-01-01 00:00:00 # 解析一个日期列表得到的是DatetimeIndex其中的每个元素都是Timestamp print(pd.to_datetime([4th of July, 2015, 2015-Jul-6, 07-07-2015, 20150708])) # 输出: DatetimeIndex([2015-07-04, 2015-07-06, 2015-07-07, 2015-07-08], dtypedatetime64[ns], freqNone)2. Period连续的“时间段”如果说Timestamp是一个“点”那么Period就是一个“段”。它代表了一个时间区间比如“2023年第一季度”、“2024年1月”。Period可以通过to_period()方法从Timestamp或DatetimeIndex转换而来你需要指定一个频率如Q表示季度。import pandas as pd # 创建一个包含日期的DataFrame df pd.read_csv(data/weather.csv) # 将日期列转换为datetime64类型 df[date] pd.to_datetime(df[date]) # 从日期列提取出季度信息得到Period类型 df[quarter] df[date].dt.to_period(Q) print(df[[date, quarter]].head()) # 输出: # date quarter # 0 2012-01-01 2012Q1 # 1 2012-01-02 2012Q1 # 2 2012-01-03 2012Q1 # 3 2012-01-04 2012Q1 # 4 2012-01-05 2012Q13. Timedelta表示“时间差”Timedelta代表两个时间点之间的差值即“时间增量”。比如从2024年1月1日到2024年1月10日时间差是9天。它基于NumPy的timedelta64类型构建同样性能卓越。# 计算日期列中每个日期与第一个日期的差值 df_date pd.to_datetime(df[date]) timedelta df_date - df_date[0] print(timedelta.head()) # 输出: # 0 0 days # 1 1 days # 2 2 days # 3 3 days # 4 4 days # Name: date, dtype: timedelta64[ns]三、将时间设为索引解锁数据检索新姿势在Pandas中将时间列设为索引是一个非常重要的操作。这不仅能让数据在视觉上更加清晰更重要的是它可以让你利用Pandas强大的时间索引功能进行非常直观和高效的切片与筛选。当你把datetime64类型的列设为索引时这个索引就变成了DatetimeIndex同理把Timedelta设为索引就得到了TimedeltaIndex。# 读取数据并将第0列日期解析为datetime64类型然后设置为索引 df pd.read_csv(data/weather.csv, parse_dates[0], index_col0) print(df.info()) # 输出: # class pandas.core.frame.DataFrame # DatetimeIndex: 1461 entries, 2012-01-01 to 2015-12-31 # ...设置好时间索引后我们就可以像变魔术一样操作数据了。直接按年份、月份切片python# 获取2013年1月到6月的所有数据 print(df.loc[2013-01:2013-06]) # 获取2015年全年的所有数据 print(df.loc[2015])精准获取特定时间段的数据python# 获取每天9:00到11:00之间的数据如果数据包含具体时分 df.between_time(9:00, 11:00) # 获取每天3:33的数据 df.at_time(3:33)四、高效生成时间序列date_range()在实际工作中我们经常需要生成一个连续的时间序列比如用于预测的时间轴。Pandas的date_range()方法就是为了解决这个需求而生。date_range()可以通过指定开始日期、结束日期或者开始日期、周期数来生成一个频率规律的DatetimeIndex。# 生成从2015-07-03到2015-07-10按天默认排列的时间序列 print(pd.date_range(2015-07-03, 2015-07-10)) # 生成从2015-07-03开始共5个时间点按天排列 print(pd.date_range(2015-07-03, periods5)) # 生成从2015-07-03开始共5个时间点按小时排列 print(pd.date_range(2015-07-03, periods5, freqh))1. 频率代码与偏移量freq参数是date_range()的灵魂。通过它你可以生成各种频率的时间序列从常见的“日D”、“月M”到复杂的“工作日B”、“季度末QE”。常见频率代码D: 日历日B: 工作日W: 周M: 月末MS: 月初Q: 季末QS: 季初Y: 年末YS: 年初h: 小时min: 分钟s: 秒灵活的偏移量组合你还可以在频率代码后加上后缀来改变其行为甚至可以将多个频率组合起来。python# 设置以1月为季末的季度频率 print(pd.date_range(2015-07-03, periods5, freqQE-JAN)) # 设置以周三为一周开始的周频率 print(pd.date_range(2015-07-03, periods5, freqW-WED)) # 组合频率生成2小时30分钟的时间间隔 print(pd.date_range(2015-07-03, periods5, freq2h30min))五、时间序列的“魔法棒”resample()重采样重采样是时间序列分析中的核心操作。它指的是将时间序列从一个频率转换到另一个频率的过程。降采样从高频率如天转换到低频率如月通常伴随着聚合操作如求平均值、总和。升采样从低频率转换到高频率通常伴随着填充或插值。在Pandas中resample()方法就是这根“魔法棒”。它可以像groupby()一样按照新的时间频率对数据进行分组然后应用聚合函数。# 按年YE对数据重采样并计算每年的平均最高温度和最低温度 print(df[[temp_max, temp_min]].resample(YE).mean()) # 输出: # temp_max temp_min # date # 2012-12-31 15.276776 7.289617 # 2013-12-31 16.058904 8.153973 # 2014-12-31 16.995890 8.662466 # 2015-12-31 17.427945 8.835616这个例子清晰地展示了如何将每天的气温数据聚合为每年的平均气温这是趋势分析中非常常见的操作。你可以使用任何你想用的聚合函数比如sum()、max()、count()等。总结今天我们系统地学习了Pandas时间序列处理的精髓。从理解Python基础datetime开始到深入掌握Pandas的三大时间类型Timestamp、Period、Timedelta再到将时间设为索引利用date_range()生成时间序列最后用resample()进行频率转换。这些知识点环环相扣构成了Pandas时间序列分析的核心框架。掌握这些技能意味着你将能够轻松应对各种格式的日期数据不再为数据清洗发愁。高效地按时间筛选和分析数据让数据检索变得直观而快速。灵活地生成和转换时间频率满足不同业务场景下的分析需求。时间序列分析是数据科学中一片广阔的天地而Pandas为你提供了一把锋利的锄头。希望这篇文章能成为你探索这片天地的得力助手。如果你觉得有收获别忘了点赞、收藏、转发让更多朋友看到

更多文章