Pandas-时间序列基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas-时间序列基础相关的知识,希望对你有一定的参考价值。
参考技术A Python标准库中包含用于日期和时间的数据类型,而且还有日历方面的功能,我们主要会用到datetime、time和calendar模块,datetime.datetime是用的最多的数据类型。datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差.
可以给datetime对象加上或者减去一个或多个timedelta,会产生一个新对象:
利用str或者strftime方法,datetime对象和pandas的Timestamp对象可以被格式化为字符串:
datetime.strptime也可以用这些格式化编码将字符串转化为日期:
datetime.strptime是通过已知格式进行日期解析的最佳方式,但是每次都要编写格式定义很麻烦,尤其是对于一些常见的日期格式,这种情况下,可以用dateutil这个第三方包中的parser.parse方法,dateutil可以解析几乎所有人类能够理解的日期表示形式:
在国际通用格式中,日通常出现在月的前面,传入dayfirst=True即可:
pandas通常是用于处理成组日期的,不管这些日期是DataFrame的轴索引还是列,to_datetime方法可以解析多种不同的日期表示形式。
to_datetime可以处理缺失值,NAT是pandas中时间戳数据的NA值:
pandas最基本的时间序列类型就是以时间戳为索引的Series:
这里的Series索引不是普通的索引,而是DatetimeIndex,而ts变为了一个TimeSeries,同时,可以看到,pandas用Numpy的datetime64数据类型以纳秒形式存储时间戳。
跟其他Series一样,不同索引的时间序列之间的算数运算会自动对齐:
DateTimeIndex中的各个标量值是pandas的Timestamp对象.
由于TimeSeries是Series的一个子类,所以在索引以及数据选曲方面他们的行为是一样的,但是我们还可以传入一个可以被解释为日期的字符串来进行索引:
对于较长的时间序列,只需传入年或年月即可轻松选取数据的切片:
通过日期进行切片的方式只对规则Series有效:
还有一个等价的实例方法也可以截取两个日期之间的TimeSeries:
DataFrame也同样适用上面的规则
pandas中的时间序列一般被认为是不规则的,也就是说,没有固定的频率,对于大部分程序而言,这是无所谓的,但是,他常常需要以某种相对固定的频率进行分析,比如每月,每日,每15min等。pandas有一套标准时间序列频率以及用于重采样,频率推断,生成固定频率日期范围的工具.
例如,我们可以将之前的时间序列转换为一个具有固定频率(每日)的时间序列,只需调用resample即可.返回DatetimeIndexResampler,获取值使用asfreq():
生成日期范围使用date_range函数
默认情况下,date_range会产生按天计算的时间点,如果只传入起始或结束日期,那就还得传入一个表示一段时间的数字:
如果你不想按天生成数据,想要按照一定的频率生成,我们传入freq参数即可.如想按5小时生成数据:
如果你想生成一个由每月最后一个工作日组成的日期索引,可以使用BM频率:
date_range默认会保留起始和结束的时间戳的时间信息,但是如果我们想产生一组规范化到午夜的时间戳,normalize选项可以实现这个功能:
WOM(week of Month)是一种非常实用的频率类,它以WOM开头,它使你能获得诸如每月第三个星期五之类的日期:
《利用Python进行数据分析》之pandas的时间序列基础
本章以《利用python进行数据分析》的第10章:时间序列 为基础,整理了pandas 库中时间序列相关用法。
时间序列数据的意义取决于具体的应用场景,主要有以下几种:
- 时间戳(timestamp)
- 固定时期(period)
- 时间间隔(interval)
- 实验或过程时间
pandas提供了一组标准的时间序列处理工具和算法,可以轻松的对时间序列进行切片、聚合,对定期/不定期的时间序列进行重采样等。
这些工具大部分对金融和经济数据尤为有用,同时也可以用来分析服务器和日志数据。
1.日期和时间数据类型及工具
python标准库包含用于日期(date)和时间(time)的数据类型,主要用到datetime、time、calendar等模块。
datetime模块
datetime模块中的数据类型
- date :以公历形式存储日期 (年月日)
- time :将时间存储为时、分、秒、毫秒
- datetime :存储日期和时间
- timedelta :表示两个datetime值之间的差 (日、秒、毫秒)
(1)datetime
- .now()函数,返回一个当前时间的datetime类型
- datetime类型 有 .year ,.month , .day等属性
import pandas as pd
from pandas import Series
from pandas import DataFrame
from datetime import datetime
now=datetime.now()
now.year,now.month,now.day
(2019, 3, 18)
(2)timedelta
- timedelta表示两个datetime对象之间的时间差
- 有 .days , .seconds 等属性
delta = datetime(2019,3,18)-datetime(2019,1,1,8,15)
delta.days
delta.seconds
56700
可以给datetime对象加上(减去)一个或者多个timedelta,则产生一个新对象
from datetime import timedelta
start=datetime(2019,1,1)
start=start+timedelta(75)
start1=start-2*timedelta(75)
start
print (start)
print (start1)
2019-03-17 00:00:00
2018-10-18 00:00:00
(3)字符串和datetime的相互转换
datetime类型或者timestamp 类型 --> 字符串类型
- str()函数
- datetime的.strftime(‘%y-%m-%d‘)方法 ,其中格式化编码表格在P306
stamp=datetime(2019,1,1)
str1=str(stamp)
str2=stamp.strftime('%Y-%m-%d %H:%M:%S')
print (str1)
print (str2)
2019-01-01 00:00:00
2019-01-01 00:00:00
字符串类型 --> datetime类型或者timestamp 类型
- datetime的.strptime方法
value='2019-01-01'
d1=datetime.strptime(value,'%Y-%m-%d')
print (d1)
2019-01-01 00:00:00
其中,是通过已知格式进行日期解析,但是编写格式定义比较麻烦
可以通过dateutil这个第三方包中parser.parse方法,可以对格式快速解析
from dateutil.parser import parse
parse('2011-01-01')
parse('6/12/2011',dayfirst=True)
datetime.datetime(2011, 12, 6, 0, 0)
pandas 通常是用于处理成组日期。
to_datetime方法可以解析多种不同的日期表示形式
datestrs=['7/6/2019','8/6/2019']
pd.to_datetime(datestrs)
DatetimeIndex(['2019-07-06', '2019-08-06'], dtype='datetime64[ns]', freq=None)
2.时间序列基础
pandas 最基本的时间序列类型就是以时间戳(python字符串 或datetime对象)为索引的Series
当创建一个带有DatatimeIndex的Series时,pandas就会创建一个TimeSeries
(1)TimeSeries的创建
import numpy as np
dates=[datetime(2019,1,1),datetime(2019,1,2),datetime(2019,1,3),datetime(2019,1,4)]
ts=Series(np.random.randn(4),index=dates)
ts
2019-01-01 -0.372832
2019-01-02 0.460571
2019-01-03 0.488445
2019-01-04 -0.208852
dtype: float64
(2)TimeSeries的索引、切片
TimeSeries是Series的一个子类,所以其索引切片都很类似
1.索引
ts.index[2]
Timestamp('2019-01-03 00:00:00')
ts[ts.index[2]]
ts[datetime(2019,1,2)]
0.4605713788911559
2.切片
可以传入字符串日期、datetime、timestamp
切片的是源数据的视图,与numpy的数组切片运算是一样的。
ts['2019-01-02':'2019-01-04']
2019-01-02 0.460571
2019-01-03 0.488445
2019-01-04 -0.208852
dtype: float64
以上是关于Pandas-时间序列基础的主要内容,如果未能解决你的问题,请参考以下文章
《利用Python进行数据分析》之pandas的时间序列基础