#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 4/14/18 4:16 PM
# @Author : Aries
# @Site :
# @File : timeseries_demo.py
# @Software: PyCharm
'''
pandas时间序列
参考:
https://blog.csdn.net/ly_ysys629/article/details/73822716
https://blog.csdn.net/pipisorry/article/details/52209377
official document: http://pandas.pydata.org/pandas-docs/stable/
http://pandas.pydata.org/pandas-docs/stable/timeseries.html
index.is_unique检查索引日期是否唯一
对非唯一时间戳的数据进行聚合,通过groupby,传入level=0 (索引的唯一一层)
含义:
时间序列类型以时间戳TimeStamp为index元素的Series类型
时间序列只是 index 比较特殊的 Series ,因此一般的索引操作对时间序列依然有效。其特别之处在于对时间序列索引的操作优化。
下面是常用操作
1时间序列的数据重复数据归档:
用法如下:
dates = pd.DatetimeIndex(['2017/06/01','2017/06/02','2017/06/02','2017/06/02','2017/06/03'])
dup_ts = pd.Series(np.arange(5), index = dates)
grouped = dup_ts.groupby(level=0).mean()
2时间序列的数据过滤:
用法如下:
dates = pd.DatetimeIndex(['2017/06/01','2017/06/02','2017/06/02','2017/06/02','2017/06/03'])
dup_ts = pd.Series(np.arange(5), index = dates)
print dup_ts[datetime(2017,6,2)]
print dup_ts['2017-06-01':'2017-06-02']
print dup_ts.truncate(after='2017-06-01')
3频率
通过插值的方式将序列转换为具有固定频率的格式,使用resample(rule)方法
用法如下:
dates = pd.DatetimeIndex(['2017-01-01','2017-01-02','2017-01-03','2017-01-06'])
ts = pd.Series(np.arange(4), index = dates)
print ts.resample('D')
4 移动
移动(超前和滞后)数据
移动(shifting):沿着时间轴将数据前移或者后移,
Series有.shift()方法用于执行但出的移动操作,index维持不变
print ts.shift(2)
print ts.shift(-2)
另一种移动方法是移动index,数据不变,需要freq参数指定移动频率
print ts.shift(2, freq='D')
5 时间跨度
生成日期范围,pd.date_range()可以生成指定长度的Datetimeindex,参数可以是起始结束日期
result = pd.date_range('00:00', '12:00', freq='1h20min')
result = pd.date_range('20100101', '20100601', freq='M')
ran = pd.period_range('2010-01', '2010-05', freq='M')
p = pd.Period(2010, freq='M')
print p + 2
6 时间序列数据聚合处理
dates = pd.DatetimeIndex(['2017-01-01','2017-01-02','2017-01-03','2017-01-06'])
ts = pd.Series(np.arange(4), index = dates)
max = ts.max()
print max
min = ts.min()
print min
sum = ts.sum()
print sum
mean = ts.mean()
print mean
count = ts.count()
print count
'''
import numpy as np
import pandas as pd
from datetime import datetime
def process():
dates = ['2017-06-20', '2017-06-21',
'2017-06-22', '2017-06-23', '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27']
ts = pd.Series(np.random.randn(8), index = pd.to_datetime(dates))
print ts
# print ts.index
# 从前往后每隔两个取数据
print ts[::2]
print ts[::-2]
# 自动数据对齐
print ts + ts[::2]
print ts[ts.index[2]]
print ts['2017-06-21']
# 带有重复索引的时间序列
dates = pd.DatetimeIndex(['2017/06/01','2017/06/02','2017/06/02','2017/06/02','2017/06/03'])
print dates
dup_ts = pd.Series(np.arange(5), index = dates)
print dup_ts
print dup_ts.index.is_unique
print dup_ts['2017-06-02']
print "group"
# 这里的groupby实际上将带有重复索引的数据按照某种方式聚合,聚合之后
# 的结果是所有数据的结果
grouped = dup_ts.groupby(level=0).mean()
print grouped
# 筛选某个日期的数据
print "data: 2017-6-2"
print dup_ts[datetime(2017,6,2)]
print "data: 2017"
print dup_ts['2017']
# 可以切片
print dup_ts['2017-06-01':'2017-06-02']
print "truncate after"
print dup_ts.truncate(after='2017-06-02')
print 'truncate before'
print dup_ts.truncate(before='2016')
def processFrequency():
dates = pd.DatetimeIndex(['2017-01-01','2017-01-02','2017-01-03','2017-01-06'])
print dates
ts = pd.Series(np.arange(4), index = dates)
print ts
# 通过插值的方式将序列转换为具有固定频率的格式,使用resample(rule)方法
print "time serize resample:"
print ts.resample('D')
#生成日期范围,pd.date_range()可以生成指定长度的Datetimeindex,参数可以是起始结束日期
#默认会按天计算时间点,通过freq进行更改
print "pandas range"
result = pd.date_range('20100101', '20100110')
print result
result = pd.date_range('20100101', '20100601', freq='M')
print result
# 频率和日期偏移量,频率=基础频率和乘数组成。
# 基础频率以字符串别名表示,例如BM,对于每隔基础频率,都有一个被称为日期偏移量的对象对应
# 通过实例化日期偏移量来创建某种频率
result = pd.date_range('00:00', '12:00', freq='1h20min')
print result
# 移动(超前和滞后)数据
# 移动(shifting):沿着时间轴将数据前移或者后移,
# Series有.shift()方法用于执行但出的移动操作,index维持不变
print ts.shift(2)
print ts.shift(-2)
# 另一种移动方法是移动index,数据不变,需要freq参数指定移动频率
print ts.shift(2, freq='D')
# 时期及其算术运算
# 时期指的是时间段,pd.Period构造函数需要时间戳,以及freq参数,用于指明period长度
# 时间戳说明period在公园时间轴上的位置
def processPeriod():
print "period process"
p = pd.Period(2010, freq='M')
print p
print p + 2
# period_range函数可以创建规则的时间范围
ran = pd.period_range('2010-01', '2010-05', freq='M')
print ran
# PeriodIndex保存一组period,可以在pandas数据结构中用做轴索引
# 时期的频率转换
# Period和PeriodIndex对象可以通过.asfreq(freq, method=None, how=None)方法被转换成别的频率
def processAggregation():
dates = pd.DatetimeIndex(['2017-01-01','2017-01-02','2017-01-03','2017-01-06'])
ts = pd.Series(np.arange(4), index = dates)
print ts
print "aggregation max:"
max = ts.max()
print max
print type(max)
print "aggregation min:"
min = ts.min()
print min
print "aggregation sum:"
sum = ts.sum()
print sum
print "aggregation mean:"
mean = ts.mean()
print mean
print "aggregation count:"
count = ts.count()
print count
if __name__ == "__main__":
process()
processFrequency()
processPeriod()
processAggregation()