【Python】干货分享 | Pandas处理时间序列的数据

机器学习初学者

共 3301字,需浏览 7分钟

 · 2021-07-04

在进行金融数据的分析以及量化研究时,总是避免不了和时间序列的数据打交道,常见的时间序列的数据有比方说一天内随着时间变化的温度序列,又或者是交易时间内不断波动的股票价格序列,今天小编就为大家来介绍一下如何用“Pandas”模块来处理时间序列的数据

01

创建一个时间戳
首先我们需要导入我们所需要用到的模块,并且随机创建一个时间戳,有两种方式来创建,如下所示
import pandas as pdimport numpy as npfrom datetime import datetime
pd.to_datetime('2021-05-20')  ##output: Timestamp('2021-05-20 00:00:00')pd.Timestamp('2021-05-20')  ##output: Timestamp('2021-05-20 00:00:00')
02

访问时间信息
我们可以来查看一下这个时间戳所代表的年、月、日等信息
a = pd.Timestamp('2021-10-01')a.day_name()    ## Friday,看来今年的10月1日是周五哈?a.month_name()  ## October 十月份a.day(), a.month(), a.year()  ## 1, 10, 2021,查看年月日等信息
03

数据格式转化为时间序列
接下来我们做一些数据处理,例如将数据集中的“time_frame”转化为时间序列的格式
df = pd.DataFrame({"time_frame": ["2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05"]})df['time_frame'] = pd.to_datetime(df['time_frame'])

04

字符串转化成时间格式
要是我们想将里面的时间序列的数据变成字符串时,可以这么来操作
date_string = [str(x) for x in df['time_frame'].tolist()]

当然从字符串转换回去时间序列的数据,在“Pandas”中也有相应的方法可以来操作,例如
time_string = ['2021-02-14 00:00:00', '2021-02-14 01:00:00', '2021-02-14 02:00:00', '2021-02-14 03:00:00', '2021-02-14 04:00:00', '2021-02-14 05:00:00', '2021-02-14 06:00:00']pd.to_datetime(time_string, infer_datetime_format = True)

当然我们还有其他的方式来实现将字符串转换成时间格式,例如
import datetimetext_1 = "2021-02-14"datetime.datetime.strptime(text_1, '%Y-%m-%d')
05

提取时间格式背后的信息
在时间序列的数据处理过程当中,我们可能需要经常来实现下面的需求

l求某个日期对应的星期数(2021-06-22是第几周)

l判断一个日期是周几(2021-02-14是周几)

l判断某一日期是第几季度,等等

当数据集中的某一列已经转化为是“datetime64”的格式时,仅需要用到“dt”的方法,就可以快速得到相应的结果,例如
df = pd.DataFrame({"time_frame": ["2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05", "2021-01-06", "2021-01-07", "2021-01-08"]})df["time_frame"] = pd.to_datetime(df["time_frame"])# 一周中的第几天df.time_frame.dt.dayofweek[0]# 返回对应额日期df.time_frame.dt.date[0]# 返回一周中的第几天,0对应周一,1对应周二 df.time_frame.dt.weekday[0]
除此之外,下表列出了几个并不常见的方法和属性

06

关于date_range函数
可用于创建时间索引,并且时间频率可以灵活调整,参数“freq”就是用来调整时间频率的,“M”代表月份,“D”就代表的是天数了
pd.date_range(start='2021-02-14', periods=10, freq='M')

07

period_range和timedelta_range函数
和上面的“date_range”函数类似,用于创建时间索引
pd.period_range('2021', periods=10, freq='M')

pd.timedelta_range(start='0', periods=24, freq='H')

08

关于重采样resample
我们也可以对时间序列的数据集进行重采样,重采样就是将时间序列从一个频率转换到另一个频率的处理过程,主要分为降采样和升采样将高频率、间隔短的数据聚合到低频率、间隔长的过程称为是降采样,反之则是升采样.

我们先来创建一个包含30个值和一个时间序列索引的数据集
A = pd.date_range('2021-01-01', periods=30, freq='D')values = np.random.randint(10, size=30)S = pd.Series(values, index=A)
返回5天时间内的数据加总
S.resample('5D').sum()

09

关于滑动窗口“rolling”和“expanding”
因此便就有了滑动窗口这一个概念,简而言之就是将某个时点的数据衍生到包含这个时点的一段时间内做一个数据统计。首先我们先来创建需要用到的数据集
index = pd.date_range('2021-01-01',periods=30data = pd.DataFrame(np.arange(len(index)),index=index,columns=['test'])

主要有“rolling”方法和“expanding”方法,“rolling”方法考虑的是一定的时间段内的数据,而“expanding”考虑的则是之前所有的数据,例如

# 移动3个值,进行求和data['sum'] = data.test.rolling(3).sum()# 移动3个值,进行求平均数data['mean'] = data.test.rolling(3).mean()

我们发现数据集中有一些缺失值,我们这里就可以使用“pandas”中特有的方法来进行填充,例如
data['mean'].fillna(method = 'backfill')


往期精彩回顾




本站qq群851320808,加入微信群请扫码:
浏览 35
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报