首页 > 代码库 > 利用Python进行数据分析——第十章 时间序列(1)

利用Python进行数据分析——第十章 时间序列(1)


# coding: utf-8

 

import pandas as pd
from datetime import datetime
from datetime import timedelta
from dateutil.parser import parse
from pandas import Series,DataFrame

rowdata=http://www.mamicode.com/pd.read_table(‘C:/Users/xiaoyniu/AG_Forcast/TrainData/TrainingData_0811.txt‘ ,keep_date_col=True)
type(rowdata)
trainingdata=http://www.mamicode.com/rowdata[[‘pkg_tss_ship_date‘,‘pkg_tss_ship_date.1‘]]
type(trainingdata)
trainingdata[:10]

trainingdata.colnames=[‘na‘,‘cn‘]
trainingdata.colnames

trainingdata[‘pkg_tss_ship_date‘]=pd.to_datetime(trainingdata[‘pkg_tss_ship_date‘])
trainingdata[‘pkg_tss_ship_date.1‘]=pd.to_datetime(trainingdata[‘pkg_tss_ship_date.1‘])
trainingdata[:10]

timedelta=trainingdata[‘pkg_tss_ship_date.1‘]-trainingdata[‘pkg_tss_ship_date‘]
timedelta[:10]

train1=trainingdata
del train1[‘pkg_tss_ship_date‘]
train1[‘timedelta‘]=timedelta
train1[:10]
type(train1[‘timedelta‘])

ts=Series(timedelta.values,index=trainingdata[‘pkg_tss_ship_date.1‘])
type(ts) #series
ts[:10]
ts.index[:10]
ts.values[:10]

stamp=ts.index[0]
stamp

ts[‘2015-08-18 00:00:00‘] #大部分是10天前的货
ts[‘2015-08‘] #无需传入完整日期也能对数据进行切片
#ts.truncate(after=‘2015-09-01‘) #另一种切片方法,去掉9月1号以后的数据

ts.index.is_unique #检查是否唯一

grouped=ts.groupby(level=0)

grouped.count() #不同日期的发货量
# grouped.median() #?????????没办法求中位数或者平均数,怎么解决

index=pd.date_range(‘20160901‘,‘20160930‘)
index #默认产生的是按天计算的时间点

 

pd.date_range(start=‘20160901‘,periods=10) #往后数10天,包含20160901
pd.date_range(end=‘20160901‘,periods=10) #往前数10天,包含20160901
pd.date_range(start=‘20160401‘,end=‘20160901‘,freq=‘BM‘) #每月的最后一个工作日
pd.date_range(start=‘20160901 10:20:30‘,periods=10) #当起始(终止)日期戳带有时间时,产生的日期戳也带有时间
pd.date_range(start=‘20160901 10:20:30‘,periods=10,normalize=True) #normalize选项可以避免这一问题,将日期规范化到午夜的时间戳

 

from pandas.tseries.offsets import Hour,Minute

 

hour=Hour()
hour
four_hour=Hour(4) #一般不用这样显式的创建这样的对象
four_hour #4个小时
pd.date_range(‘20160901‘,‘20160902‘,freq=‘8h‘) #一般这样由一个基础频率和一个乘数组成的字符串参数来结合使用
pd.date_range(‘20160901‘,‘20160902‘,freq=‘8h30min‘)
Hour(4)+Minute(30) #大部分偏移量对象都可以直接用加法连接,区分大小写

 

rng=pd.date_range(‘20160901‘,‘20161201‘,freq=‘WOM-2FRI‘) #week of month:每月第二个星期五
rng

 

ts2=ts.shift(2) #时间戳不变,将数据向后移两天
ts2[:10]
tsf2=ts.shift(-2) #时间戳不变,将数据向前移两天
tsf2[:10]

 

from pandas.tseries.offsets import Day,MonthEnd

 

datetime.now()+3*Day()
datetime.now()+Day(3)

 

datetime.now()+MonthEnd() #9月底
datetime.now()+MonthEnd(3) #11月底

 

offset=MonthEnd()
offset
offset.rollforward(datetime.now()) #向后推一个月,到月底
offset.rollback(datetime.now()) #向前推一个月,到月底
offset2=MonthEnd(3)
offset2
offset2.rollforward(datetime.now()) #向后推一个月,到月底。 为什么不是向后推3个月???
offset2.rollback(datetime.now()) #向前推一个月,到月底。 ???

 

import pytz #处理时区

 

pytz.common_timezones[-5:] #通常的几个时区
pytz.timezone(‘US/Eastern‘) #利用时区名,获取时区对象

 

print(ts.index.tz) #ts的索引中没有时区信息
#可以在创建数据集的时候通过 tz=‘UTC’来创建

 

ts_utc=ts.tz_localize(‘UTC‘) #本地化时区
ts_utc.tz_convert(‘US/Eastern‘) #本地化后的时间序列才能被转换成别的时区

 

stamp=pd.Timestamp(‘2011-03-12 04:00‘) #timestamp对象也能通过本地化,转换成其他时区
stamp_utc=stamp.tz_localize(‘US/Eastern‘) #但是timestamp对象是什么东西???
stamp_utc
stamp_utc.tz_convert(‘utc‘)

 

stamp_moscow=pd.Timestamp(‘2011-03-12 04:00‘,tz=‘UTC‘) #创建timestamp对象时可以传入一个时区信息
stamp_moscow
stamp_moscow.value #UTC时间戳???
stamp_moscow.tz_convert(‘US/Eastern‘).value #时区变换,而这个时间戳不会发生改变。但是为什么???

 

from pandas.tseries.offsets import Hour
import numpy as np

 

rng=pd.date_range(‘2016-09-01‘,periods=10,freq=‘B‘)
ts=Series(np.random.randn(len(rng)),index=rng)

ts1=ts[:7].tz_localize(‘Europe/London‘)
ts2=ts1[2:].tz_convert(‘Europe/Moscow‘)
result=ts1+ts2 #当两个不同的时区相加时,
result.index #最后得到的结果是UTC

 

p=pd.Period(2007,freq=‘A-DEC‘) #period类是一段时间的意思,这是指从2007年1月1日到2007年12月31日
p
p+5
p-2 #根据其频率对时间进行位移
pd.Period(2009,freq=‘A-DEC‘)-p #频率相同时,可以直接相减

 

rng=pd.period_range(‘2009-09-09‘,‘2010-01-02‘,freq=‘M‘)
rng #period_range 也可以创建规则的时期范围

 

value=http://www.mamicode.com/[‘2003‘,‘2004‘,‘2005‘]
index=pd.PeriodIndex(value,freq=‘Q-DEC‘) #periodindex是个什么类???
index

 

p.asfreq(‘M‘,‘start‘) #将年度数据转换为月度的形式,转换到当年的一月
p.asfreq(‘M‘,‘end‘) #将年度数据转换为月度的形式,转换到当年的十二月
p1=pd.Period(‘2016‘,freq=‘A-JUN‘)
p1.asfreq(‘M‘,‘start‘) #Period(‘2015-07‘, ‘M‘)
p1.asfreq(‘M‘,‘end‘) #Period(‘2016-06‘, ‘M‘)

 

p2=pd.Period(‘2016-09‘,‘M‘)
p2.asfreq(‘A-JUN‘) #2016年9月进行频率转换,相当于以六月结尾的时间频率中的2017年

 

rng=pd.period_range(‘2006‘,‘2009‘,freq=‘A-DEC‘)
ts=Series(np.random.randn(len(rng)),index=rng)
ts.asfreq(‘M‘,how=‘start‘)
ts.asfreq(‘M‘,how=‘end‘)

 

p5=pd.Period(‘2016Q3‘,freq=‘A-MAR‘) #Q n在这里 有什么用???
p5.asfreq(‘d‘,‘start‘) #Period(‘2015-04-01‘, ‘D‘)
p5.asfreq(‘d‘,‘end‘) #Period(‘2016-03-31‘, ‘D‘)

 

rng=pd.period_range(‘2011Q3‘,‘2012Q4‘,freq=‘Q-JAN‘) #使用period_range生成季度数据
ts=Series(np.arange(len(rng)),index=rng)

 

rng=pd.date_range(‘2016-01‘,‘2016-09‘,freq=‘m‘)
rng.to_period() #data_range对象才有to_period方法,to_period方法可以将时间戳索引转换为时期索引
p6=pd.Period(‘2016‘,freq=‘A-DEC‘)
p6.to_timestamp(how=‘end‘) #to_timestamp方法可以将时期索引转换为时间戳

 

rng=pd.date_range(‘2016-01-29‘,periods=6,freq=‘d‘)
rng.to_period(freq=‘m‘) #产生重叠的时间区间

 

利用Python进行数据分析——第十章 时间序列(1)