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')
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')
相关文章推荐
- pandas 时间序列 之日期范围、频率及移动
- pands 时间序列 之日期和时间数据类型及工具
- C++各基础数据类型长度以及范围
- SQL Server数据类型,其中的日期有范围datetime:旧版本的日期时间类型,范围1753-01-01 to 9999-12-31,精确到3.33毫秒
- 时间序列分析:ts/mts基础数据类型
- mysql中数字类型、日期和时间类型以及字符串(字符)类型及大数据在hibernate中的配置
- DB2 基础: 使用 DB2 数据移动实用工具中的文件类型修饰符
- Java语言基础(五) Java原始数据类型的分类以及数据范围
- 6、SQL基础整理(日期时间数据类型,转换函数)
- MySQL基础教程17-Mysql数据类型-日期时间
- MySQL基础教程2 —— 数据类型之日期和时间类型
- 【Unity基础知识④】数据类型,内存大小,数据的范围以及整型
- C++各基础数据类型长度以及范围(总结)
- Microsoft Access、MySQL 以及 SQL Server 所使用的数据类型和范围。
- SQL Server 日期和时间相关的数据类型有两种
- 处理日期和时间数据--日期和时间数据类型
- 《Oracle编程艺术》学习笔记(36)-数据类型-时间日期
- MySQL日期数据类型、时间类型使用总结
- MySQL日期数据类型、时间类型使用总结
- 数据类型——日期时间