利用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=pd.read_table('C:/Users/xiaoyniu/AG_Forcast/TrainData/TrainingData_0811.txt' ,keep_date_col=True)
type(rowdata)
trainingdata=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=['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') #產生重疊的時間區間

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM