# 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‘) #产生重叠的时间区间