pandas timeseries 时间序列

时间序列主要有以下三种:

时间戳(timstamp):特定的时刻
固定时期(period):比如2007年全年
时间间隔(interval):起始时间戳–结束时间戳

Python时间模块回顾:

datetime模块:https://blog.csdn.net/weixin_44595372/article/details/87995896
time模块
https://blog.csdn.net/weixin_44595372/article/details/87992590

时间序列的主要方法

1. pandas.to_datetime(): 将对象转换为datetime对象:
语法
pandas.to_datetime(arg, dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin=‘unix’, cache=False)pandas.to_datetime(arg, errors=‘raise’, dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin=‘unix’, cache=False)
几个主要参数:
args:可以是整数,浮点数,datetime,列表,元祖,一维数组,series,dataframe/字典
dayfirst: 如传入的arg参数是str或者list-like数据,则认为原参数的顺序为 d/m/y, 比如10/11/12 解析为2012-11-10
yearfirst:如传入的arg参数是str或者list-like数据,则认为原参数的顺序为 y/m/d, 比如:10/11/12 解析为2010-11-12
format: 自定义输出格式,datetime格式定义见附录1

#示例:传入一个整数元祖:
import pandas as pd
dt=pd.to_datetime((1,2,3),format='%Y-%m-%d')
print(dt)

#输出
DatetimeIndex(['1970-01-01 00:00:00.000000001',
               '1970-01-01 00:00:00.000000002',
               '1970-01-01 00:00:00.000000003'],
              dtype='datetime64[ns]', freq=None)

2. pandas.date_range(start=None, end=None, periods=None, freq=None)
生成均匀分布的时间序列
参数:
start:字符串/datetime 起始值
end:字符串/datetime 结束值
periods:生成个数
freq:偏移量,str, 默认按天计算,为’D’ ,如果是5天一次则为‘5D’, 格式定义如附录2

import pandas as pd
dt = pd.date_range(start='2018-01-01', periods=3, freq='3H')
print(dt)
#输出:
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 03:00:00',
               '2018-01-01 06:00:00'],
              dtype='datetime64[ns]', freq='3H')

3. 对日期进行索引和切片:timeseries是series的一个子集,series切片索引的方法也适用于timeseries
series方法参考:https://blog.csdn.net/weixin_44595372/article/details/88072413

import pandas as pd
ts=pd.date_range('2018/01/03','2019/01/05',freq='M')
data=range(len(ts))
seri=pd.Series(data,index=ts)
print(seri.index[5:9])
#输出:
DatetimeIndex(['2018-06-30', '2018-07-31', '2018-08-31', '2018-09-30'], dtype='datetime64[ns]', freq='M')

4. 对于较长的时间序列,只需传入年月日即可切片/索引:

import pandas as pd
from datetime import datetime
ts=pd.date_range('2018/01/03','2019/01/05',freq='M')
data=range(len(ts))
seri=pd.Series(data,index=ts)
print(seri[datetime(2018,5,3):datetime(2018,12,4)]) #查询起止时间可以不再索引里,会返回ts里符合条件的范围
#输出:
2018-05-31     4
2018-06-30     5
2018-07-31     6
2018-08-31     7
2018-09-30     8
2018-10-31     9
2018-11-30    10

5. truncate方法截取日期:

print(seri.truncate(before='2018/05/10'))
#输出:
2018-05-31     4
2018-06-30     5
2018-07-31     6
2018-08-31     7
2018-09-30     8
2018-10-31     9
2018-11-30    10
2018-12-31    11

6. 时区设置与转换:

import pandas as pd
dt = pd.date_range('2018-01-01', periods=3, freq='H')
dti = dt.tz_localize('UTC')
dti2=dti.tz_convert('US/Pacific')
print(dt)
print(dti)
print(dti2)
#输出:
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
               '2018-01-01 02:00:00'],
              dtype='datetime64[ns]', freq='H')
DatetimeIndex(['2018-01-01 00:00:00+00:00', '2018-01-01 01:00:00+00:00',
               '2018-01-01 02:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq='H')
DatetimeIndex(['2017-12-31 16:00:00-08:00', '2017-12-31 17:00:00-08:00',
               '2017-12-31 18:00:00-08:00'],
              dtype='datetime64[ns, US/Pacific]', freq='H')

7. 对以时间序列为Index的series、datframe 进行重采样:
timeseries.resample(‘new_freq’):

#实例
将样本频率从1h变成2h,并获取其平均值
import pandas as pd
idx = pd.date_range('2018-01-01', periods=5, freq='H')

ts = pd.Series(range(len(idx)), index=idx)

print(ts.resample('2H').mean())
#输出:
2018-01-01 00:00:00    0.5
2018-01-01 02:00:00    2.5
2018-01-01 04:00:00    4.0
Freq: 2H, dtype: float64

**8. 日期和时间的加减: pd.timedelta(args,kwargs)
参数可以是:
str=‘1 day’/‘2 hours’,‘3 minutes’,‘10 seconds’
int: date/hour/minute/second=int

import pandas as pd
fri=pd.Timestamp('2018-01-03')
sat=fri+pd.Timedelta('3 days 2 hours')
print(fri)
print(sat)
#输出

9. 生成时间空值:pd.Timestamp(NaT)------输出: NaT
10. pd.Period(): 创建时期
value : datetime类str
freq : str 频率,见附录2

year : int, default None,month : int, default 1,quarter : int, default None,day : int, default 1,hour : int, default 0,minute : int, default 0,second : int, default 0

import pandas as pd
dt=pd.Period('2017',freq='M') #构建一个初始值为2017-01-01 00:00:00,频率为月的时间构造器
print(dt)
print(dt+1) #在dt的基础上增加1,单位为M(月)
#输出:
import pandas as pd
dt=pd.Period('2017',freq='M')
print(dt,type(dt))
print(dt+1)

11. shift(integer,freq)方法移动数据:
表示在索引顺序不变的情况下,将数据向前或向后移动到指定位置,正数表示向后移动,负数表示向前移动,移动后部分数据会丢失。传入freq值后,结果变成日期的前移/后移,而非数据移动表示在索引顺序不变的情况下,将数据向前或向后移动到指定位置,正数表示向后移动,负数表示向前移动,移动后部分数据会丢失。传入freq值后,结果变成日期的前移/后移,而非数据移动

import pandas as pd
from datetime import datetime
ts=pd.date_range('2018/01/03','2019/01/05',freq='M')
data=range(len(ts))
seri=pd.Series(data,index=ts)
print(seri)
print(seri.shift(-2))
print(seri.shift(-2,freq='D'))

#输出:
2018-01-31     0
2018-02-28     1
2018-03-31     2
2018-04-30     3
2018-05-31     4
2018-06-30     5
2018-07-31     6
2018-08-31     7
2018-09-30     8
2018-10-31     9
2018-11-30    10
2018-12-31    11
Freq: M, dtype: int64

2018-01-31     2.0
2018-02-28     3.0
2018-03-31     4.0
2018-04-30     5.0
2018-05-31     6.0
2018-06-30     7.0
2018-07-31     8.0
2018-08-31     9.0
2018-09-30    10.0
2018-10-31    11.0
2018-11-30     NaN
2018-12-31     NaN

#传入freq 参数
2018-01-29     0
2018-02-26     1
2018-03-29     2
2018-04-28     3
2018-05-29     4
2018-06-28     5
2018-07-29     6
2018-08-29     7
2018-09-28     8
2018-10-29     9
2018-11-28    10
2018-12-29    11
dtype: int64

12. pd.period_range()创建时期范围:
参数:
start: datetime 开始时间
end:datetime 结束时间
periods:int 生成数量
freq:str,见附录2,频率

import pandas as pd
dt=pd.period_range(start='2017-01-01', end='2018-01-01', freq='M')
print(dt)
#输出:
PeriodIndex(['2017-01', '2017-02', '2017-03', '2017-04', '2017-05', '2017-06',
             '2017-07', '2017-08', '2017-09', '2017-10', '2017-11', '2017-12',
             '2018-01'],
            dtype='period[M]', freq='M')

13. PeriodIdex(data,freq): 将传入的data参数合并,以指定的频率生成period
接受参数:
data:
year : int, array, or Series, default None
month : int, array, or Series, default None
quarter : int, array, or Series, default None
day : int, array, or Series, default None
hour : int, array, or Series, default None
minute : int, array, or Series, default None
second : int, array, or Series, default None
tz : object, default None
Timezone for converting datetime64 data to Periods

freq:见附录2

import pandas as pd
data=pd.read_csv('exampledata.csv')
year=data['year']
month=data['month']
date=data['date']

index=pd.PeriodIndex(year=year,month=month,freq='Q-DEC') #对freq='Q-DEC的理解见文末'
print(index)
#输出:
PeriodIndex(['1959Q1', '1959Q1', '1959Q1', '1959Q2', '1960Q1', '1960Q1',
             '1960Q1', '1960Q2', '1961Q1', '1961Q1',
             ...
             '2007Q1', '2007Q1', '2007Q2', '2008Q1', '2008Q1', '2008Q1',
             '2008Q2', '2009Q1', '2009Q1', '2009Q1'],
            dtype='period[Q-DEC]', length=203, freq='Q-DEC')

附录1:datetime格式定义
在这里插入图片描述
附录2:时间序列的基础频率
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以季度计算的freq的理解,
例如freq=month, 加入month指定为FEB,则该频率的含义是;指定2月为一个自然年的结算年度,2月是该自然年最后一季度的最后一个月,那么该自然年最后一季度包含的月份有 1月,2月和前一年的12月,该自然年的第三季度包含月份有上一年的9,10,11月,以此类推。(如上图)

猜你喜欢

转载自blog.csdn.net/weixin_44595372/article/details/88131673