Pandas时间相关的方法
2023-12-14 16:54:58
在处理时序数据时,pandas提供了许多好用的方法,这里总结一些常用的。
一、准备工作
首先,我们得有一个包含时间列的数据。以读取表格为例,很多时候你的时间列可能会被识别为字符串。因此,我们需要将其进行转换。
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 时序数据示例
1、读取表格时解析
from pandas import read_csv
df = read_csv('test.csv', parse_dates=['时间'])
传参之所以是一个列表,是因为可以解析多个时间列,如parse_dates=['北京时间', '宇宙时间']
2、调用单独的解析方法
from pandas import to_datetime
df['时间'] = to_datetime(df['时间'])
3、自定义解析方法
虽然pandas自带的解析方法能自动处理很多常见的时间表达形式,但不可能完全覆盖,实际的业务永远是未知且多变的。如"2023年12月12日 占位 11:11"
from datetime import datetime
def my_to_datetime(s):
t = datetime.strptime(s, '%Y年%m月%d日 占位 %H:%M')
return t
print(my_to_datetime('2023年12月12日 占位 11:11'))
# 输出:
2023-12-12 11:11:00
针对dataframe,可以调用apply方法
df['时间'] = df['时间'].apply(my_to_datetime)
4、生成时间序列
如果数据中没有时间列,但你知道时间的起始,那么可以生成等间隔的时间序列,最后将时间列和数据合并。
# 指定起止时间和间隔,这里是天;如果是十分钟间隔,freq='10T'
times = date_range('2023-01-01', '2023-01-05', freq='d')
print(times)
# 输出:
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
'2023-01-05'],
dtype='datetime64[ns]', freq='D')
5、将时间作为索引
df.index = df['时间']
?二、基于时间索引的操作
1、抽样
如表格示例,数据时间范围为2023-01-01到2023-03-31,如果我想将其中一部分数据抽样出来
# 选取一天数据;类似的,df['2023-01']表示选择一个月数据
df['2023-01-01']
# 输出:
时间 变量1 变量2 变量3
时间
2023-01-01 00:00:00 2023-01-01 00:00:00 15.20 12.14 61.58
2023-01-01 00:10:00 2023-01-01 00:10:00 15.19 11.99 61.73
2023-01-01 00:20:00 2023-01-01 00:20:00 15.17 11.57 61.84
... ... ... ... ...
2023-01-01 23:40:00 2023-01-01 23:40:00 16.33 13.04 60.84
2023-01-01 23:50:00 2023-01-01 23:50:00 16.32 12.14 60.18
[144 rows x 4 columns]
2、重采样
如果我们的原始数据采样频率过高,那么可以重采样后降低频率。如毫秒级到秒级,秒级到分钟级等。(当然,也可以提高采样频率,只不过需要填充)
# 示例,一个月求一个均值
df.resample('M').mean()
# 输出:
变量1 变量2 变量3
时间
2023-01-31 18.786064 10.326438 55.753224
2023-02-28 21.443209 11.937121 57.061620
2023-03-31 24.607846 11.292513 56.869731
3、滑动窗口
# 每3行求一个平均,窗口每次滑动一个位置
df.iloc[:5, 1:].rolling(window=3).mean()
# 输出:
变量1 变量2 变量3
时间
2023-01-01 00:00:00 NaN NaN NaN
2023-01-01 00:10:00 NaN NaN NaN
2023-01-01 00:20:00 15.186667 11.900000 61.716667
2023-01-01 00:30:00 15.183333 11.880000 61.840000
2023-01-01 00:40:00 15.163333 12.143333 61.976667
可以看到,前两行的值为空。这是因为它们前面的行数不满足要求(加上本身共3行),要解决这个问题,可以使用填充fillna,也可以设置最小窗口
# 最少一行数据,即只有一行时结果就是自身,两行时就求两行的均值
df.iloc[:5, 1:].rolling(window=3, min_periods=1).mean()
# 输出:
变量1 变量2 变量3
时间
2023-01-01 00:00:00 15.200000 12.140000 61.580000
2023-01-01 00:10:00 15.195000 12.065000 61.655000
2023-01-01 00:20:00 15.186667 11.900000 61.716667
2023-01-01 00:30:00 15.183333 11.880000 61.840000
2023-01-01 00:40:00 15.163333 12.143333 61.976667
4、将数据按固定时间长度分组
比如,将数据按月分组后传入自定义函数进行下一步处理。分组的函数是groupby,但现在缺少分组标签。一个方法是对同一个月的数据赋予同一个标签,可以使用自定义方法,也可以使用自带的方法
df.groupby(pd.Grouper(freq='M')).apply(my_func)
5、将时间按固定间隔输出
比如我现在有3个月数据,我希望输出包含年月的列表
df.index.to_period('M').unique().astype(str).to_list()
# 输出:
['2023-01', '2023-02', '2023-03']
文章来源:https://blog.csdn.net/qq_45055172/article/details/134976937
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!