主要内容:时序数据,我的理解就是直接以时间为索引的序列,同时对时间信息有多种方法来实现对数据的灵活操作。
时间序列的创建有多种方式,可以用to_datetime方法和date_range方法来实现。
时间序列支持索引和切片操作
rng = pd.date_range('2020','2021', freq='W')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts['2020-01-26']
# 混合形态的索引
ts['2020-01-26':'20200726']
采用dt对象可以轻松获得关于时间的信息,利用strftime可重新修改时间格式,对于datetime对象可以直接通过属性获取信息。
对时序数据的操作中存在着类似groupby的分组操作,也就是所谓重采样,指的resample函数。采样之后必须配合其它方法比如sum、mean等,不然返回的只是个内部地址。采样组可以迭代,采样组的迭代和groupby迭代完全类似,对于每一个组都可以分别做相应操作。
最后是窗口函数,主要是rolling和expanding,它们的作用是规定一个窗口,然后配合聚合函数来使用。主要的参数是window和min_periods,前者指定窗口宽度,后者是指需要的非缺失数据点数量阀值。
问题与练习
【问题一】 如何对date_range进行批量加帧操作或对某一时间段加大时间戳密度?
我对加帧的理解是在两行时序数据之间插入新数据,不知道这样对不对:
import pandas as pd
import numpy as np
rng = pd.date_range(start='2020/1/1', end='2020/1/10', periods=3)
ts = pd.Series(np.random.randn(3), index=rng)
for i in range(0, len(ts)-1):
irng = pd.date_range(start=ts.index[i], end=ts.index[i+1], periods=5)
its = pd.Series(np.random.randn(len(irng)), index=irng)
ts = ts.append(dict(zip([its.index.astype('str')[1:(len(its) - 1)]], its[1:(len(its) - 1)])), ignore_index=True)
print(ts.index())
【问题二】 如何批量增加TimeStamp的精度?
import pandas as pd
pd.Timestamp('2020-01-01') + pd.offset.Second(0)
【问题三】 对于超出处理时间的时间点,是否真的完全没有处理方法?
可以将超出处理时间的时间点减去最大时间,将差值记录下来存储到值中。
【问题四】 给定一组非连续的日期,怎么快速找出位于其最大日期和最小日期之间,且没有出现在该组日期中的日期?
import pandas as pd
rng = pd.date_range(start='2020/1/1', end='2020/1/10', periods=2)
rng_all = pd.date_range(start='2020/1/1', end='2020/1/10', periods=4)
print(rng_all[~rng_all.isin(rng)])