python_时间序列(Python时间序列图)

网友投稿 307 2022-08-24


python_时间序列(Python时间序列图)

python_时间序列

Time Series##### 第11章 时间序列# 时间序列(time series)数据是⼀种重要的结构化数据形式,应# ⽤于多个领域,包括⾦融学、经济学、⽣态学、神经科学、物理# 学等。在多个时间点观察或测量到的任何事物都可以形成⼀段时# 间序列。很多时间序列是固定频率的,也就是说,数据点是根据# 某种规律定期出现的(⽐如每15秒、每5分钟、每⽉出现⼀# 次)。时间序列也可以是不定期的,没有固定的时间单位或单位# 之间的偏移量。时间序列数据的意义取决于具体的应⽤场景,主# 要有以下⼏种:# 时间戳(timestamp),特定的时刻。# 固定时期(period),如2007年1⽉或2010年全年。# 时间间隔(interval),由起始和结束时间戳表示。时期# (period)可以被看做间隔(interval)的特例。# 实验或过程时间,每个时间点都是相对于特定起始时间的⼀# 个度量。例如,从放⼊烤箱时起,每秒钟饼⼲的直径# pandas提供了许多内置的时间序列处理⼯具和数据算法。因# 此,你可以⾼效处理⾮常⼤的时间序列,轻松地进⾏切⽚/切# 块、聚合、对定期/不定期的时间序列进⾏重采样等。有些⼯具# 特别适合⾦融和经济应⽤,你当然也可以⽤它们来分析服务器⽇# 志数据import numpy as npimport pandas as pdnp.random.seed(12345)import matplotlib.pyplot as pltplt.rc('figure', figsize=(10, 6))PREVIOUS_MAX_ROWS = pd.options.display.max_rowspd.options.display.max_rows = 20np.set_printoptions(precision=4, suppress=True)Date and Time Data Types and Tools# 11.1 ⽇期和时间数据类型及⼯具# Python标准库包含⽤于⽇期(date)和时间(time)数据的数据# 418# 类型,⽽且还有⽇历⽅⾯的功能。我们主要会⽤到datetime、# time以及calendar模块。datetime.datetime(也可以简写为# datetime)是⽤得最多的数据类型:from datetime import datetimenow = datetime.now()nownow.year, now.month, now.day(2019, 12, 1)# datetime以毫秒形式存储⽇期和时间。timedelta表示两个# datetime对象之间的时间差:delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)delta# delta.days# delta.secondsdatetime.timedelta(926, 56700)from datetime import timedeltastart = datetime(2011, 1, 7)start + timedelta(12)start - 2 * timedelta(12)datetime.datetime(2010, 12, 14, 0, 0)#####################################################Converting Between String and Datetimefrom datetime import datetime# 字符串和datetime的相互转换# 利⽤str或strftime⽅法(传⼊⼀个格式化字符串),datetime对象# 和pandas的Timestamp对象(稍后就会介绍)可以被格式化为字# 符串:stamp = datetime(2011, 1, 3)str(stamp)# 对日期进行格式化stamp.strftime('%Y-%m-%d')'2011-01-03'# datetime.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][datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]日期# datetime.strptime是通过已知格式进⾏⽇期解析的最佳⽅式。但# 是每次都要编写格式定义是很麻烦的事情,尤其是对于⼀些常⻅# 的⽇期格式。这种情况下,你可以⽤dateutil这个第三⽅包中的# 421 格式化日期# parser.parse⽅法(pandas中已经⾃动安装好了):from dateutil.parser import parseparse('2011-01-03')datetime.datetime(2011, 1, 3, 0, 0)parse('Jan 31, 1997 10:45 PM')datetime.datetime(1997, 1, 31, 22, 45)parse('6/12/2011', dayfirst=True)datetime.datetime(2011, 12, 6, 0, 0)imort pandas as pd# pandas通常是⽤于处理成组⽇期的,不管这些⽇期是# DataFrame的轴索引还是列。to_datetime⽅法可以解析多种不同# 的⽇期表示形式。对标准⽇期格式(如ISO8601)的解析⾮常# 快:import numpy as npimport pandas as pddatestrs = ['2011-07-06 12:00:00', '2011-08-06 00:00:00']pd.to_datetime(datestrs)DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)# 它还可以处理缺失值(None、空字符串等):idx = pd.to_datetime(datestrs + [None])idxidx[2]pd.isnull(idx)array([False, False, True])Time Series Basics11.2 时间序列基础# pandas最基本的时间序列类型就是以时间戳(通常以Python字# 符串或datatime对象表示)为索引的Series:# 11.2 时间序列基础# pandas最基本的时间序列类型就是以时间戳(通常以Python字# 符串或datatime对象表示)为索引的Series:from datetime import datetimedates = [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 = pd.Series(np.random.randn(6), index=dates)ts2011-01-02 -0.2938912011-01-05 -1.7925732011-01-07 0.5983552011-01-08 -0.2881922011-01-10 1.1167602011-01-12 -0.155656dtype: float64# 这些datetime对象实际上是被放在⼀个DatetimeIndex中的:ts.indexDatetimeIndex(['2011-01-02', '2011-01-05', '2011-01-07', '2011-01-08', '2011-01-10', '2011-01-12'], dtype='datetime64[ns]', freq=None)# 跟其他Series⼀样,不同索引的时间序列之间的算术运算会⾃动# 按⽇期对⻬:# ts[::2] 是每隔两个取⼀个。# pandas⽤NumPy的datetime64数据类型以纳秒形式存储时间# 戳:ts + ts[::2]2011-01-02 -0.5877822011-01-05 NaN2011-01-07 1.1967092011-01-08 NaN2011-01-10 2.2335192011-01-12 NaNdtype: float64ts.index.dtypedtype('传⼊⼀个整数即可定义偏移量的倍数:# 传⼊⼀个整数即可定义偏移量的倍数:four_hours = Hour(4)four_hours<4 * Hours># ⼀般来说,⽆需明确创建这样的对象,只需使⽤诸# 如"H"或"4H"这样的字符串别名即可。在基础频率前⾯放上⼀个# 整数即可创建倍数:pd.date_range('2000-01-01', '2000-01-03 23:59', freq='4h')DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 04:00:00', '2000-01-01 08:00:00', '2000-01-01 12:00:00', '2000-01-01 16:00:00', '2000-01-01 20:00:00', '2000-01-02 00:00:00', '2000-01-02 04:00:00', '2000-01-02 08:00:00', '2000-01-02 12:00:00', '2000-01-02 16:00:00', '2000-01-02 20:00:00', '2000-01-03 00:00:00', '2000-01-03 04:00:00', '2000-01-03 08:00:00', '2000-01-03 12:00:00', '2000-01-03 16:00:00', '2000-01-03 20:00:00'], dtype='datetime64[ns]', freq='4H')# ⼤部分偏移量对象都可通过加法进⾏连接:Hour(2) + Minute(30)<150 * Minutes>同理,你也可以传⼊频率字符串(如"2h30min"),这种字符串# 可以被⾼效地解析为等效的表达式:# 同理,你也可以传⼊频率字符串(如"2h30min"),这种字符串# 可以被⾼效地解析为等效的表达式:pd.date_range('2000-01-01', periods=10, freq='1h30min')DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 01:30:00', '2000-01-01 03:00:00', '2000-01-01 04:30:00', '2000-01-01 06:00:00', '2000-01-01 07:30:00', '2000-01-01 09:00:00', '2000-01-01 10:30:00', '2000-01-01 12:00:00', '2000-01-01 13:30:00'], dtype='datetime64[ns]', freq='90T')#### Week of month dates# WOM(Week Of Month)是⼀种⾮常实⽤的频率类,它以WOM# 开头。它使你能获得诸如“每⽉第3个星期五”之类的⽇期:rng = pd.date_range('2012-01-01', '2012-09-01', freq='WOM-3FRI')list(rng)[Timestamp('2012-01-20 00:00:00', freq='WOM-3FRI'), Timestamp('2012-02-17 00:00:00', freq='WOM-3FRI'), Timestamp('2012-03-16 00:00:00', freq='WOM-3FRI'), Timestamp('2012-04-20 00:00:00', freq='WOM-3FRI'), Timestamp('2012-05-18 00:00:00', freq='WOM-3FRI'), Timestamp('2012-06-15 00:00:00', freq='WOM-3FRI'), Timestamp('2012-07-20 00:00:00', freq='WOM-3FRI'), Timestamp('2012-08-17 00:00:00', freq='WOM-3FRI')]Shifting (Leading and Lagging) Data移动(超前和滞后)数据# 移动(shifting)指的是沿着时间轴将数据前移或后移。Series和# DataFrame都有⼀个shift⽅法⽤于执⾏单纯的前移或后移操作,# 保持索引不变:# 移动(超前和滞后)数据# 移动(shifting)指的是沿着时间轴将数据前移或后移。Series和# DataFrame都有⼀个shift⽅法⽤于执⾏单纯的前移或后移操作,# 保持索引不变:ts = pd.Series(np.random.randn(4), index=pd.date_range('1/1/2000', periods=4, freq='M'))tsts.shift(2)ts.shift(-2)2000-01-31 0.3036042000-02-29 -1.2117512000-03-31 NaN2000-04-30 NaNFreq: M, dtype: float64ts / ts.shift(1) - 1ts.shift(2, freq='M')这⾥还可以使⽤其他频率,于是你就能⾮常灵活地对数据进⾏超# 前和滞后处理了:# 这⾥还可以使⽤其他频率,于是你就能⾮常灵活地对数据进⾏超# 前和滞后处理了:ts.shift(3, freq='D')ts.shift(1, freq='90T')2000-01-31 01:30:00 0.7217572000-02-29 01:30:00 -0.3863972000-03-31 01:30:00 0.3036042000-04-30 01:30:00 -1.211751Freq: M, dtype: float64Shifting dates with offsets# 通过偏移量对⽇期进⾏位移# pandas的⽇期偏移量还可以⽤在datetime或Timestamp对象上:from pandas.tseries.offsets import Day, MonthEndnow = datetime(2011, 11, 17)now + 3 * Day()Timestamp('2011-11-20 00:00:00')如果加的是锚点偏移量(⽐如MonthEnd),第⼀次增量会将原# ⽇期向前滚动到符合频率规则的下⼀个⽇期:# 如果加的是锚点偏移量(⽐如MonthEnd),第⼀次增量会将原# ⽇期向前滚动到符合频率规则的下⼀个⽇期:now + MonthEnd()now + MonthEnd(2)Timestamp('2011-12-31 00:00:00')通过锚点偏移量的rollforward和rollback⽅法,可明确地将⽇期向# 前或向后“滚动”:# 通过锚点偏移量的rollforward和rollback⽅法,可明确地将⽇期向# 前或向后“滚动”:offset = MonthEnd()offset.rollforward(now)offset.rollback(now)Timestamp('2011-10-31 00:00:00')⽇期偏移量还有⼀个巧妙的⽤法,即结合groupby使⽤这两个“滚 动”⽅法:# ⽇期偏移量还有⼀个巧妙的⽤法,即结合groupby使⽤这两个“滚 动”⽅法:ts = pd.Series(np.random.randn(20), index=pd.date_range('1/15/2000', periods=20, freq='4d'))tsts.groupby(offset.rollforward).mean()2000-01-31 -0.1168902000-02-29 0.0657602000-03-31 -0.323985dtype: float64ts.resample('M').mean()


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python_透视表操作unstack(透视表的操作)
下一篇:python_透视表和交叉表(Python 透视表)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~