【Pandas驯化-14】一文搞懂Pandas中的时间处理函数date_range、resample、shift技巧
本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 相关内容文档获取 微信公众号
🎇 相关内容视频讲解 B站
🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
下滑查看解决方法
🎯 1. 基本介绍
如果要对时间序列相关的数据进行数据分析与挖掘,而时间做为一种特殊的数据格式,不同于字符串,整型的数据格式,但是它们之间又是有一定的联系,在介绍pandas时间处理的方法之前,首先介绍一下关于python的时间处理的相关知识以及常用的包:
首先对于时间维度信息在进行数据分析以及特征工程的时候经常挖掘分析的时间维度信息如下:年、月、日、是否周末、是否节假日、一年中的第几周、一周中的第几天、距离节假日的时间距离、年月日结合相关业务操作的时间范围、针对业务特征日期的处理
- 因此,对于上述时间维度的数据分析和挖掘,朝天椒将自己在时间维度上的一些处理骚手段总结如下:
- python处理时间的常用包datetime
- datetime数据格式为:datetime(year,month,day,hour,minute,second, microsecond), 然后可以通过相关的api得到一个时间戳的各个小字段。还有对于datetime类型的时间戳二者之间可以进行相互加,减等操作:
💡 2. 使用方法
2.1 date_range函数使用
该函数主要参数有开始(start)、结束时间(end),多长时间范围periods,以及按什么频率(freq)方式进行时间移动,通过该函数得到的是一个pandas个数的datetime数据格式,因此可以直接使用datetime的相关属性函数对数据进行相关的操作。具体的使用例子如下:
import pandas as pd
# 生成日期范围
date_index = pd.date_range('2024-06-01', periods=5, freq='D')
print(date_index)
DatetimeIndex(['2024-06-01', '2024-06-02', '2024-06-03',
'2024-06-04', '2024-06-05'],
dtype='datetime64[ns]', freq='D')
# 默认按天进行移动,可以按月,年等,还可以具体多少天进行移动
tmp = pd.date_range(start='2018-01-01', periods=10, frep='3M')
tmp = tmp.strftime('%F').tolist()
2.2 pd.resample函数使用
pd.resample():神奇的对时间进行采样的函数, 该函数除了采样功能外,还可以进行一些关于时间的统计, 主要有加、减、乘等操作, 相关于一种快速的对时间按年月日等进行分组操作, 介绍几个重要的参数:
- 1.colsed:如果为left就是将时间区间分为多少个区间,每个区间都是左闭右开,如果为right则是左开右闭
- 2.label:如果就是选用区间的哪边作为结果的索引值
- 3.rule:按什么方式进行采样,’3D’:三天
- 4.how:通过什么样的方式, 这个可以通过参数控制, 也可以通过属性函数的写法,特别注意的一个是, 金融中有个函数可以对其进行快速的计算最大、最小值等’ohlc’
- 5.fill_method:对缺失值进行填充的方法, ‘bfill’, 等
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
df = pd.DataFrame({'values': np.arange(12)},
index=pd.date_range('2018-01-01', periods=12, freq='D'))
df_time = df.resample('3D', closed='left').sum()
print("每3天汇总一次的结果(closed='left'):")
print(df_time)
values
2018-01-01 3
2018-01-04 9
2018-01-07 15
...
# 升采样:按6小时填充
df_time2 = df.resample('3D', closed='right').sum()
print("\n每3天汇总一次的结果(closed='right'):")
print(df_time2)
values
2018-01-02 6
2018-01-05 12
2018-01-08 9
...
# 升采样:按6小时填充
df = pd.DataFrame({'values': np.arange(2)},
index=pd.date_range('2018-01-01', periods=2, freq='D'))
df_time = df.resample('6H').asfreq()
print("\n按6小时升采样(使用 asfreq)的结果:")
print(df_time)
values
2018-01-01 0.0
2018-01-01 1.0 # 第二行是原始数据
... ...
🔍 3. 注意事项
对上述的各个函数在使用的过程中需要注意的一些事项,不然可能会出现error,具体主要为:
- resample 方法的 closed 参数控制了如何定义分组的边界,‘left’ 表示闭左开右,‘right’ 表示闭右开左。
- asfreq 方法用于将时间序列升采样到指定的频率,但不会填充缺失值。
- ffill 方法用于向前填充缺失值,bfill 方法用于向后填充。
🔧 4. 总结
本文通过实际代码示例介绍了 Pandas 中的 resample 方法在时间序列数据降采样和升采样中的应用。我们学习了如何使用不同的参数来控制重采样的行为,包括 closed、asfreq、ffill 等。这些技巧对于处理不同频率的时间序列数据非常有用。希望这篇博客能够帮助你更好地理解并应用这些时间序列处理功能。