6-Pandas时间序列处理的基础(时序数据类型、筛选、子集提取、重复时间索引操作)

一、Pandas中时间序列的类型  

  Pandas中最为基础的时间序列类型就是以时间戳(通过以Python字符串或datetime对象表示)为索引的Series

>>> import pandas as pd
>>> import numpy as np
>>> dates = ['2020-8-1','2020-8-2','2020-8-3','2020-8-4','2020-8-5']
>>> ts = pd.Series(np.random.randint(0,10,5))
>>> ts.index = pd.to_datetime(dates)
>>> ts
2020-08-01    5
2020-08-02    5
2020-08-03    9
2020-08-04    7
2020-08-05    7
dtype: int32

二、Pandas中时间序列数据的筛选

  关于日期数据的筛选与python基本库中的切片方式一致;

#选取前3条数据
>>> ts[:3]
2020-08-01    5
2020-08-02    5
2020-08-03    9
dtype: int32

#从前往后(正序),每个两个元素取数据
>>> ts[::2]
2020-08-01    5
2020-08-03    9
2020-08-05    7
dtype: int32

#从后往前(逆序),每两个元素取数据
>>> ts[::-2]
2020-08-05    7
2020-08-03    9
2020-08-01    5
dtype: int32

  Pandas不同索引之间的时间序列之前的算数运算会自动按日期进行对齐(其实只是Series的特征罢了)

>>> ts+ts[::2]
2020-08-01    10.0
2020-08-02     NaN
2020-08-03    18.0
2020-08-04     NaN
2020-08-05    14.0
dtype: float64

三、Pandas中时间序列数据如何提取子集  

  (1)通过index[]选取子集

>>> ts.index
DatetimeIndex(['2020-08-01', '2020-08-02', '2020-08-03', '2020-08-04',
               '2020-08-05'],
              dtype='datetime64[ns]', freq=None)
>>> len(ts.index)
5
>>> ts.index[2]
Timestamp('2020-08-03 00:00:00')
>>> ts[ts.index[2]]
9

  (2)通过字符串选取子集,在这需要注意的是:传入的字符串需要能被解析成日期;

    也可以传入只包含年或年月的字符串,选取该范围内的子集;

>>> ts['2020-8-1']
5
>>> ts['2020/8/1']
5
>>> ts['8/1/2020']
5

>>> ts['2020-8']
2020-08-01    5
2020-08-02    5
2020-08-03    9
2020-08-04    7
2020-08-05    7
dtype: int32

  (3)通过truncate方法选取子集

truncate()常用参数有after和before,传入参数后,after之后或before之前的数据将全部被删除;

>>> ts.truncate(after='2020-8-3')
2020-08-01    5
2020-08-02    5
2020-08-03    9
dtype: int32
>>> ts.truncate(before='2020-8-3')
2020-08-03    9
2020-08-04    7
2020-08-05    7
dtype: int32

四、带有重复索引的时间序列的操作

在某些应用场景中,通常会存在一个时间点上有多个观测数据的情况,对于带有重复索引的时间序列,一般情况下使用如下两种方法进行操作:

  • index.is_unique检查索引日期是否唯一
  • 使用groupby()对数据进行分组聚合
>>> dup_ts = pd.Series(np.random.randint(0,5,5))
>>> dup_ts.index = pd.to_datetime(['2020-8-1','2020-8-2','2020-8-2','2020-8-2','2020-8-3'])
>>> dup_ts
2020-8-1    3
2020-8-2    0
2020-8-2    2
2020-8-2    2
2020-8-3    0
dtype: int32

>>> dup_ts['2020-8-1']
3
>>> dup_ts['2020-8-2']
2020-8-2    0
2020-8-2    2
2020-8-2    2
dtype: int32

#查看时间序列的索引是否唯一
>>> dup_ts.index.is_unique
False

#使用groupby进行分组聚合
>>> dup_ts.groupby(level=0).sum()
2020-8-1    3
2020-8-2    4
2020-8-3    0
dtype: int32

>>> dup_ts.groupby(level=0).count()
2020-8-1    1
2020-8-2    3
2020-8-3    1
dtype: int64

五、补充  

若有一个csv文件,在数据导入是可以通过参数实现将字符串类型的时间设为索引,设定index_col为0即以数据中第一列为索引,设定parse_datesTrue,会把索引识别为时间数据类型

>>>data = pd.read_csv('***.csv',index_col=0,parse_dates=True)

  

  

 

posted @ 2020-08-09 16:43  大脸猫12581  阅读(981)  评论(0编辑  收藏  举报