Pandas数据分析24——pandas时间重采样聚合

 参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》


pandas对数据可以进行频率的更改,比如将每五分钟的数据改为每分钟的数据,或者将高频的小时数据改为日期数据,都很方便。主要依赖resample()方法。


还是先导入包

import numpy as np 
import pandas as pd
import datetime

时间格式化

#解析时间
pd.Timestamp('now').strftime('%Y年%m月%d日')
pd.to_datetime('2022*11*12',format='%Y*%m*%d')


时间重采样

#resample() 是一个基于时间的分组依据,后面是每个分组的聚合方法。

rng = pd.date_range('1/1/2012', periods=1000, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
ts

原始数据是一秒钟一条

 # 每5分钟进行一次聚合

ts.resample('5Min').sum()

 #重采样功能非常灵活,可以指定许多不同的参数来控制频率转换和重采样操作。
#通过分派可用的任何函数(类似于 grouby)都可以作为返回对象的方法,包括 sum,mean,std,sem,max,min,mid,median,first,last,ohlc:

ts.resample('5Min').mean() # 平均
ts.resample('5Min').max() # 最大值

ohlc美国线

 #ohlc类似股票的K线,蜡烛图,能展示这个区间的开始值,最高值,最低值,收盘值

ts.resample('5Min').ohlc()

 #开闭区间指定

#对于采样,可以将 closed 设置为“ left”或“ right”,以指定关闭区间的哪一端:
ts.resample('5Min', closed='right').mean()
ts.resample('5Min', closed='left').mean()

 


上采样

#把数据扩充到更高的时间频率

 #对于上采样,您可以指定一种上采样的方法,并指定 limit 参数以对创建的间隙进行插值:

# 从每秒到每250毫秒
ts.resample('250L').asfreq()

 填充

ts.resample('250L').ffill()
ts.resample('250L').bfill(limit=2)

重采样聚合

 #类似于 aggregating API, groupby API, 和窗口方法 api, Resampler 也适用相关方法。重新采样DataFrame时,默认值是对具有相同功能的所有列进行操作:

df = pd.DataFrame(np.random.randn(1000, 3),index=pd.date_range('1/1/2012', freq='S', periods=1000),columns=['A', 'B', 'C'])
r = df.resample('3T')
r.mean()

 选取部分列

r['A'].mean()
r[['A', 'B']].mean()

 #多个聚合方式:

#多个聚合方式:
r['A'].agg([np.sum, np.mean, np.std])
r.agg([np.sum, np.mean]) # 每个列
# 不同的聚合方式
r.agg({'A': np.sum,
       'B': lambda x: np.std(x, ddof=1)})
# 用字符指定
r.agg({'A': 'sum', 'B': 'std'})
r.agg({'A': ['sum', 'std'], 'B': ['mean', 'std']})

#如果索引不是时间,可以指定采样的时间列:

# date 是一个普通列
df.resample('M', on='date').sum()
df.resample('M', level='d').sum() # 多层索引

时间类型间转化

 #本文介绍不同时间概念之间的相互转换。带时间戳的数据可以使用 to_period 转换为PeriodIndex-ed 数据,反之亦然可以使用 to_timestamp 转换为 PeriodIndex-ed 数据。

rng = pd.date_range('1/1/2012', periods=5, freq='M')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts

ps = ts.to_period()
ps

ps.to_timestamp()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阡之尘埃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值