您的位置:首页 > 其它

2015-04-09-时间序列(1)-日期和时间数据类型及工具+时间序列基础+日期的范围、频率以及移动

2015-04-09 21:58 519 查看
from pandas import DataFrame,Series

import numpy as np

import pandas as pd

-----------------------------------------------------------------------------------------

-----(一)、日期和时间数据类型及工具

--datetime.datetime

from datetime import datetime

now=datetime.now()

now

now.year,now.month,now.day

--datetime.timedelta 两个datetime对象之间的时间差:

delta=datetime(2011,1,7)-datetime(2008,6,24,8,15)

delta=datetime(2007,6,24,8,10)-datetime(2008,6,24,8,11)

delta

delta.days

delta.seconds

--给datetime对象加上(或减去)一个或多个timedelta

from datetime import timedelta

start=datetime(2011,1,7)

start+timedelta(12)

start-2*timedelta(12)

-------------------

date 以公历形式存储日历日期(年、月、日)

time 将时间存储为时、分、秒、毫秒

datetime 存储日期和时间

timedelta 表示两个datetime值之间的差(日、秒、毫秒)

-------------------

------字符串和datetime的相互转换

--str或strftime方法  日期转换为字符串

stamp=datetime(2011,1,3)

str(stamp)

stamp.strftime('%Y-%m-%d')

--strptime将字符串转换为日期

value='2011-01-03'

datetime.strptime(value,'%Y-%m-%d')

datestrs=['7/6/2011','8/6/2011']

[datetime.strptime(x,'%m/%d/%Y') for x in datestrs]

--dateutil.parser.parse方法

from dateutil.parser import parse

parse('2011-01-03')

parse('Jan 31,1997 10:45 PM')

parse('6/12/2011',dayfirst=True)

--pandas的 to_datetime方法

datestrs

pd.to_datetime(datestrs)

可以处理缺失值

idx=pd.to_datetime(datestrs+[None])

idx

idx[2]

pd.isnull(idx)

------------------------------------

datetime格式定义

%Y 4位数的年

%y 2位数的年

%m 2位数的月[01,12]

%d 2位数的日[01,31]

%H 时(24小时制)[00,23]

%I 时(12小时制)[01,12]

%M 2位数的分[00:59]

%S 秒[00,61](秒60和秒61用于闰秒)

%w 用整数表示的星期几[0,6]

%U 每年的第几周[0,53]。星期天被认为是每周的第一天,每年第一个星期天之前的那几天被认为是第0周

%W 每年的第几周[0,53]。星期一被认为是每周的第一天,每年第一个星期一之前的那几天被认为是第0周

%z 以+HHMM或-HHMM表示的UTC时区偏移量,如果时区为native,则返回空字符串

%F %Y-%m-%d简写形式

%D %m/%d/%y简写形式

特定于当前环境的日期格式

%a 星期几的简写

%A 星期几的全称

%b 月份的简写

%B 月份的全称

%c 完整的日期和时间

%p 不同环境下的AM或PM

%x 适用于当前环境的日期格式

%X 适用于当前环境的时间格式

------------------------------------

-----------------------------------------------------------------------------------------

-----(二)、时间序列基础

from datetime import datetime

dates=[datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),datetime(2011,1,8),datetime(2011,1,10),datetime(2011,1,12)]

ts=Series(np.random.randn(6),index=dates)

ts

type(ts)

ts.index

不同索引的时间序列之间的算术运算会自动按日期对齐

ts+ts[::2]

pandas用NumPy的datetime64数据类型以纳秒形式存储时间戳

ts.index.dtype

DatetimeIndex中的各个标量值是pandas的Timestamp对象:

stamp=ts.index[0]

stamp

-----1.索引、选取、子集构造

stamp=ts.index[2]

ts[stamp]

ts['1/10/2011']

ts['20110110']

longer_ts=Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000))

longer_ts

longer_ts['2001']

longer_ts['2001-05']

longer_ts['2001-05-21':]

ts[datetime(2011,1,7):]

范围查询

ts

ts['1/6/2011':'1/11/2011']

截取

ts.truncate(after='1/9/2011')

DataFrame

dates=pd.date_range('1/1/2000',periods=100,freq='W-WED')

long_df=DataFrame(np.random.randn(100,4),index=dates,columns=['a','b','c','d'])

long_df.ix['5-2001']

-----2.带有重复索引的时间序列

dates=pd.DatetimeIndex(['1/1/2000','1/2/2000','1/2/2000','1/2/2000','1/3/2000'],dayfirst=True)

dup_ts=Series(np.arange(5),index=dates)

dup_ts

dup_ts.index.is_unique

grouped=dup_ts.groupby(level=0)

grouped.mean()

grouped.count()

-----------------------------------------------------------------------------------------

-----(三)、日期的范围、频率以及移动

转换为具有固定频率(每日)的时间序列

ts

ts.resample('D')

-----1.生成日期范围

index=pd.date_range('4/1/2012','6/1/2012')

index

pd.date_range(start='4/1/2012',periods=20)

pd.date_range(end='6/1/2012',periods=20)

生成由每月最后一个工作日组成的日期索引

pd.date_range('1/1/2000','12/1/2000',freq='BM')

date_range默认会保留起始和结束时间戳的时间信息

pd.date_range('5/2/2012 12:56:31',periods=5)

规范化到0点0分0秒

pd.date_range('5/2/2012 12:56:31',periods=5,normalize=True)

-----2.频率和日期偏移量

from pandas.tseries.offsets import Hour,Minute

hour=Hour()

hour

four_hours=Hour(4)

four_hours

pd.date_range('1/1/2000','1/3/2000 23:59',freq='4h')

Hour(2)+Minute(30)

频率字符串

pd.date_range('1/1/2000',periods=10,freq='1h30min')

时间序列的基础频率 如下图



-----3.WOM日期

每月第3个星期五

rng=pd.date_range('1/1/2012','9/1/2012',freq='WOM-3FRI')

list(rng)

-----4.移动(超前和滞后)数据

ts=Series(np.random.randn(4),index=pd.date_range('1/1/2000',periods=4,freq='M'))

ts

ts.shift(2)

ts.shift(-2)

shift通常用于计算一个时间序列或多个时间序列中的百分比变化

ts/ts.shift(1)-1

实现对时间戳进行位移

ts.shift(2,freq='M')

ts.shift(3,freq='D')

ts.shift(1,freq='3D')

ts.shift(1,freq='90T')

-----4.通过偏移量对日期进行位移

from pandas.tseries.offsets import Day,MonthEnd

now=datetime(2011,11,17)

now+3*Day()

now+MonthEnd()

now+MonthEnd(2)

offset=MonthEnd()

offset.rollforward(now)

offset.rollback(now)

ts=Series(np.random.randn(20),index=pd.date_range('1/15/2000',periods=20,freq='4d'))

ts.groupby(offset.rollforward).mean()

ts.resample('M',how='mean')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: