python+pandas生成指定日期和重采样的方法


Posted in Python onApril 11, 2018

python 日期的范围、频率、重采样以及频率转换

pandas有一整套的标准时间序列频率以及用于重采样、频率推断、生成固定频率日期范围的工具。

生成指定日期范围的范围

pandas.date_range()用于生成指定长度的DatatimeIndex:

1)默认情况下,date_range会按着时间间隔为天的方式生成从给定开始到结束时间的时间戳数组;

2)如果只指定开始或结束时间,还需要periods标定时间长度。

import pandas as pd
pd.date_range('2017-6-20','2017-6-27')
DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23',
   '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'],
   dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30','2017-6-27')
DatetimeIndex(['2017-06-20 12:59:30', '2017-06-21 12:59:30',
   '2017-06-22 12:59:30', '2017-06-23 12:59:30',
   '2017-06-24 12:59:30', '2017-06-25 12:59:30',
   '2017-06-26 12:59:30'],
   dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30',periods = 8)
DatetimeIndex(['2017-06-20 12:59:30', '2017-06-21 12:59:30',
   '2017-06-22 12:59:30', '2017-06-23 12:59:30',
   '2017-06-24 12:59:30', '2017-06-25 12:59:30',
   '2017-06-26 12:59:30', '2017-06-27 12:59:30'],
   dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30',periods = 8, normalize = True)
DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23',
   '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'],
   dtype='datetime64[ns]', freq='D')

频率和日期偏移量

pandas中的频率是由一个基础频率(M、H)也可以是(Hour、Minute、h、min等)

pd.date_range('2017-6-27',periods = 7,freq = '1h30min')
DatetimeIndex(['2017-06-27 00:00:00', '2017-06-27 01:30:00',
   '2017-06-27 03:00:00', '2017-06-27 04:30:00',
   '2017-06-27 06:00:00', '2017-06-27 07:30:00',
   '2017-06-27 09:00:00'],
   dtype='datetime64[ns]', freq='90T')
pd.date_range('2017-6-27',periods = 7,freq = 'M')
DatetimeIndex(['2017-06-30', '2017-07-31', '2017-08-31', '2017-09-30',
   '2017-10-31', '2017-11-30', '2017-12-31'],
   dtype='datetime64[ns]', freq='M')
pd.date_range('2017-6-27',periods = 7,freq = 'd')
DatetimeIndex(['2017-06-27', '2017-06-28', '2017-06-29', '2017-06-30',
   '2017-07-01', '2017-07-02', '2017-07-03'],
   dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-27',periods = 7,freq = 'H')
DatetimeIndex(['2017-06-27 00:00:00', '2017-06-27 01:00:00',
   '2017-06-27 02:00:00', '2017-06-27 03:00:00',
   '2017-06-27 04:00:00', '2017-06-27 05:00:00',
   '2017-06-27 06:00:00'],
   dtype='datetime64[ns]', freq='H')

常用的基础频率

别名 偏移量 说明
D/d Day 每日历日
B BusinessDay 每工作日
H/h Hour 每小时
T或min Minute 每分
S Secend 每秒
L或ms Milli 每毫秒(每千分之一秒)
U Micro 每微秒(即百万分之一秒)
M MonthEnd 每月最后一个日历日
BM BusinessDayEnd 每月最后一个工作

上表只展示了部分!

WOM日期(可获得例如“每月第3个星期五”)

pd.date_range('2017-06-01','2017-07-31',freq='WOM-3FRI')
DatetimeIndex(['2017-06-16', '2017-07-21'], dtype='datetime64[ns]', freq='WOM-3FRI')

重采样及频率转换

降采样:高频数据到低频数据

升采样:低频数据到高频数据

主要函数:resample()(pandas对象都会有这个方法)

resample方法的参数

参数 说明
freq 表示重采样频率,例如‘M'、‘5min',Second(15)
how='mean' 用于产生聚合值的函数名或数组函数,例如‘mean'、‘ohlc'、np.max等,默认是‘mean',其他常用的值由:‘first'、‘last'、‘median'、‘max'、‘min'
axis=0 默认是纵轴,横轴设置axis=1
fill_method = None 升采样时如何插值,比如‘ffill'、‘bfill'等
closed = ‘right' 在降采样时,各时间段的哪一段是闭合的,‘right'或‘left',默认‘right'
label= ‘right' 在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:35
loffset = None 面元标签的时间校正值,比如‘-1s'或Second(-1)用于将聚合标签调早1秒
limit=None 在向前或向后填充时,允许填充的最大时期数
kind = None 聚合到时期(‘period')或时间戳(‘timestamp'),默认聚合到时间序列的索引类型
convention = None 当重采样时期时,将低频率转换到高频率所采用的约定(start或end)。默认‘end'

降采样

需考虑:

1)各区间哪边是闭合的(参数:closed)

2)如何标记各聚合面元,用区间的开头还是末尾(参数:label)

ts_index = pd.date_range('2017-06-20',periods =12,freq = '1min')#一分钟采样数据
ts = pd.Series(np.arange(12),index = ts_index)
ts
2017-06-20 00:00:00 0
 2017-06-20 00:01:00 1
 2017-06-20 00:02:00 2
 2017-06-20 00:03:00 3
 2017-06-20 00:04:00 4
 2017-06-20 00:05:00 5
 2017-06-20 00:06:00 6
 2017-06-20 00:07:00 7
 2017-06-20 00:08:00 8
 2017-06-20 00:09:00 9
 2017-06-20 00:10:00 10
 2017-06-20 00:11:00 11
 Freq: T, dtype: int32

聚合到5分钟

ts.resample('5min',how='sum')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated
 the new syntax is .resample(...).sum()
 if __name__ == '__main__':
 2017-06-20 00:00:00 10
 2017-06-20 00:05:00 35
 2017-06-20 00:10:00 21
 Freq: 5T, dtype: int32
ts.resample('5min',how='sum',closed='left')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated
 the new syntax is .resample(...).sum()
 if __name__ == '__main__':
 2017-06-20 00:00:00 10
 2017-06-20 00:05:00 35
 2017-06-20 00:10:00 21
 Freq: 5T, dtype: int32
ts.resample('5min',how='sum',closed='left',label ='left')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated
 the new syntax is .resample(...).sum()
 if __name__ == '__main__':
 2017-06-20 00:00:00 10
 2017-06-20 00:05:00 35
 2017-06-20 00:10:00 21
 Freq: 5T, dtype: int32

通过groupby进行重插样

另外一种降采样方法

ts1_index = pd.date_range('2017-6-01',periods = 100,freq = 'd')
ts1 = pd.Series(np.arange(100),index = ts1_index)
ts1.head()
2017-06-01 0
 2017-06-02 1
 2017-06-03 2
 2017-06-04 3
 2017-06-05 4
 Freq: D, dtype: int32
ts1.groupby(lambda x:x.month).mean()
6 14.5
 7 45.0
 8 76.0
 9 95.5
 dtype: float64
ts1.groupby(lambda x:x.weekday).mean()
0 49.5
 1 50.5
 2 51.5
 3 49.0
 4 50.0
 5 47.5
 6 48.5
 dtype: float64
df1 = pd.DataFrame(np.arange(200).reshape(100,2),index = ts1_index)
df1.groupby(lambda x:x.weekday).mean()

0 1
0 99 100
1 101 102
2 103 104
3 98 99
4 100 101
5 95 96
6 97 98

对于具有时间序列索引的pandas数据结构,当groupby传入一个函数时,可以对时间索引对应列进行聚合

升采样

升采样没有聚合,但是需要填充

df2 = pd.DataFrame(np.arange(200).reshape(100,2),index = ts1_index,columns=['add1','add2'])
df2.head()

add1 add2
2017-06-01 0 1
2017-06-02 2 3
2017-06-03 4 5
2017-06-04 6 7
2017-06-05 8 9
df2.resample('W-THU',fill_method = 'ffill')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: fill_method is deprecated to .resample()
 the new syntax is .resample(...).ffill()
 if __name__ == '__main__':

add1 add2
2017-06-01 0 1
2017-06-08 14 15
2017-06-15 28 29
2017-06-22 42 43
2017-06-29 56 57
2017-07-06 70 71
2017-07-13 84 85
2017-07-20 98 99
2017-07-27 112 113
2017-08-03 126 127
2017-08-10 140 141
2017-08-17 154 155
2017-08-24 168 169
2017-08-31 182 183
2017-09-07 196 197
2017-09-14 198 199

总结

本篇博客主要内容:

1)生成指定时间段,指定频率的日期

2)对含有时间索引的pandas数据进行重采样,包括降采样和升采样等。

Python 相关文章推荐
Python的词法分析与语法分析
May 18 Python
用PyQt进行Python图形界面的程序的开发的入门指引
Apr 14 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
python3对接mysql数据库实例详解
Apr 30 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
Jan 18 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 Python
详解OpenCV曝光融合
Apr 29 Python
基于Python编写一个监控CPU的应用系统
Jun 25 Python
python dataframe astype 字段类型转换方法
Apr 11 #Python
pandas series序列转化为星期几的实例
Apr 11 #Python
pandas的object对象转时间对象的方法
Apr 11 #Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 #Python
python的dataframe转换为多维矩阵的方法
Apr 11 #Python
python的dataframe和matrix的互换方法
Apr 11 #Python
pandas DataFrame数据转为list的方法
Apr 11 #Python
You might like
PHP字符串处理的10个简单方法
2010/06/30 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
超市促销实习自我鉴定
2013/09/23 职场文书
优秀学生干部个人的自我评价
2013/10/04 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS