Pandas: 2、时间序列处理

 
#!/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()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/79942277