数据预处理中的时间序列

263 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

1.什么是时间序列?

时间序列(time series) 数据是一种重要的结构化数据形式, 应用于多个领域, 包括金融学、 经济学、 生态学、 神经科学、 物理学等。 在多个时间点观察或测量到的任何事物都可以形成一段时间序列。 很多时间序列是固定频率的, 也就是说, 数据点是根据某种规律定期出现的(比如每15秒、每5分钟、 每月出现一次)。时间序列也可以是不定期的, 没有固定的时间单位或单位之间的偏移量。 时间序列数据的意义取决于具体的应用场景, 主要有以下几种:

  1. 时间戳(timestamp) , 特定的时刻。
  2. 固定时期(period) , 如2007年1月或2010年全年。
  3. 时间间隔(interval) , 由起始和结束时间戳表示。 时期(period) 可以被看做间隔
    (interval) 的特例。

2.日期和时间数据类型及工具

Python标准库包含用于日期(date) 和时间(time) 数据的数据类型, 而且还有日历方面的功能。我们主要会用到datetime、 time以及calendar模块。 datetime.datetime(也可以简写为datetime)是用得最多的数据类型:

image.png

from datetime import datetime
now=datetime.now()
now

datetime以毫秒形式存储日期和时间。 timedelta表示两个datetime对象之间的时间差:

image.png

delta=datetime(2011,1,7)-datetime(1999,6,24,8,15)
delta

3.字符串和datetime的相互转换

利用str或strftime方法(传入一个格式化字符串),datetime对象和pandas的Timestamp对象可以被格式化为字符串:

image.png

stamp=datetime(2022,10,31)
str(stamp)

datetime.strptime是通过已知格式进行日期解析的最佳方式。 但是每次都要编写格式定义是很麻烦
的事情, 尤其是对于一些常见的日期格式。这种情况下,可以用dateutil这个第三方包中的parser.parse方法(pandas中已经自动安装好了):

image.png

import pandas as pd
from dateutil.parser import parse
parse('2022-10-31')

pandas通常是用于处理成组日期的, 不管这些日期是DataFrame的轴索引还是列。 to_datetime方法可以解析多种不同的日期表示形式。 对标准日期格式的解析非常快

4.时间序列基础

pandas最基本的时间序列类型就是以时间戳(通常以Python字符串或datatime对象表示) 为索引的Series:

image.png

import pandas as pd
import numpy as np
from datetime import datetime
dates=[datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),
       datetime(2011,1,9),datetime(2011,1,11),datetime(2011,1,13),]
ts=pd.Series(np.random.randn(6),index=dates)
ts

这些datetime对象实际上是被放在一个DatetimeIndex中的 image.png

ts.index

跟其他Series一样, 不同索引的时间序列之间的算术运算会自动按日期对齐

image.png

ts+ts[::2]

ts[::2] 是每隔两个取一个。

4.1 索引、选取

当根据标签索引选取数据时, 时间序列和其它的pandas.Series很像:

image.png

stamp=ts.index[2]
ts[stamp]

在某些应用场景中, 可能会存在多个观测数据落在同一个时间点上的情况。 下面就是一个例子:

image.png

dates=pd.DatetimeIndex(['1/1/2000','1/2/2000','1/3/2000','1/2/2000','1/2/2000',])
dup_ts=pd.Series(np.arange(5),index=dates)
dup_ts

对这个时间序列进行索引, 要么产生标量值, 要么产生切片, 具体要看所选的时间点是否重复,假设你想要对具有非唯一时间戳的数据进行聚合。 一个办法是使用groupby, 并传入level=0:

image.png

grouped=dup_ts.groupby(level=0)
grouped.mean()