Python数学建模 时间序列处理

基于Python的数学建模

时间序列处理

datatime数据转换

  • Python内置datetime模块提供了各种日期和时间对象。
  • Pandas可以将datatime对象转换为Timestamp时间戳对象便于进一步处理
  • Timeseries以及创建了大量用于操作时间序列数据的新功能。
import pandas as pd
import datetime
import numpy as np

# 将datetime转换为Timestamp对象
timestamp = pd.to_datetime('20220128')
print(timestamp)
# pd.to_datetime可以接受不同类型的datetime对象
# 多个datetime对象将被将被转换为DatetimeIndex类
Date_Index = pd.to_datetime(
    ['20220125', '26/01/2022', np.datetime64('2022-02-25'), datetime.datetime(2022, 2, 26)])
print(Date_Index)

在这里插入图片描述

  • 创建以时间戳为索引的DataFrame/Series对象
data_dataframe = pd.DataFrame(
    [[5, 3], [10, 5], [15, 7], [20, 9]], index=Date_Index)
print(data_dataframe)
print('-------')
data_series = pd.Series([5, 10, 15, 20], index=Date_Index)
print(data_series)

在这里插入图片描述

时间序列索引

位置索引

print(data_dataframe.iloc[2,:])
print(data_series[2])

在这里插入图片描述

时间戳(index)索引

  • 符合被解析的日期格式可以直接输入
print(data_dataframe.loc['2022-01-25'])
print(data_dataframe.loc['20220125'])
print(data_dataframe.loc['2022.01.25'])
print(data_dataframe.loc['2022/01/25'])
print(data_series['20220125'])

在这里插入图片描述

  • 可以用指定年或月份操作索引数据
print(data_dataframe.loc['2022'])
print(data_dataframe.loc['2022-01'])

在这里插入图片描述

truncate()方法截取

# 对数据进行重新排序
data_dataframe = data_dataframe.sort_index()
# 截取指定时间段的数据
print(data_dataframe.truncate(before='2022-02-1', after=None, axis=0, copy=True))
print(data_dataframe.truncate(before=None, after='2022-02-1', axis=0, copy=True))

在这里插入图片描述

创建时间序列

创建固定频率的时间序列

  • DatetimeIndex是用来创建一系列时间点的一种pandas结构
datetime_index = pd.date_range(start='2022/01/01', end='2022/02/28',periods=7)
datetime_index

在这里插入图片描述

datetime_index = pd.date_range(start='2022/01/01', end='2022/02/28',freq='B')
datetime_index

在这里插入图片描述

指定时间序列频率与偏移量

  • pandas.tseries.offsets模块
from pandas.tseries.offsets import *
# 生成日期偏移量
date_offset  = Week(1) + Hour(7)
pd.date_range('2022/1/1', '2022/1/31', freq=date_offset)

在这里插入图片描述

创建标准的时间段或时期

  • PeriodIndex是用来创建一系列时间段的pandas结构
# 创建Period对象,表示从2022-01-01到2022-12-31之间的时间段
period = pd.Period('2017/6')
period

在这里插入图片描述

# 表示从2022-01-01到2022-01-30之间的整月时间
period = pd.Period('2022/1')
period

在这里插入图片描述

  • Period对象可进行数学运算
period + 1   # Period对象加上一个整数

在这里插入图片描述

  • 创建多个Period对象
period_index = pd.period_range('2022-01-01', '2022-06-30', freq='M')
period_index

在这里插入图片描述

  • 时间频率转换
period = pd.Period('2022', freq='A-DEC')
period.asfreq('M', how='start')

在这里插入图片描述### 时间序列的移动

date_index = pd.date_range('2022/01/01', periods=5)
time_series = pd.Series(np.arange(5) + 1, index=date_index)
print(time_series)
print('------------')
# 向后移动一次
print(time_series.shift(1))
print('------------')
# 向前移动一次
print(time_series.shift(-1))

在这里插入图片描述

时间序列重采样

重采样(Resample)

  • resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, ...)
date_index = pd.date_range('2022-01-01', periods=30)
time_series = pd.Series(np.arange(30), index=date_index)
time_series

在这里插入图片描述

time_series.resample('W-MON').mean()

在这里插入图片描述

降采样

  • 降采样时间颗粒会变大,数据量是减少的。为了避免有些时间戳对应的数据闲置,可以利用内置方法聚合数据。
date_index = pd.date_range('2022/01/01', periods=30)
shares_data = np.random.rand(30)
time_ser = pd.Series(shares_data, index=date_index)
time_ser

在这里插入图片描述

time_ser.resample('7D').ohlc()  # OHLC重采样

在这里插入图片描述

升采样

  • 升采样的时间颗粒是变小的,数据量会增多,这很有可能导致某些时间戳没有相应的数据
  • 常用的解决办法为插值
data_demo = np.array([['101', '210', '150'], ['330', '460', '580']])
date_index = pd.date_range('2018/06/10', periods=2, freq='W-SUN')
time_df = pd.DataFrame(data_demo, index=date_index, 
columns=['A产品', 'B产品', 'C产品'])
time_df

在这里插入图片描述

time_df.resample('D').asfreq()

在这里插入图片描述

time_df.resample('D').ffill()

在这里插入图片描述

滑动窗口

  • 根据指定的单位长度来框住时间序列,从而计算框内的统计指标。
  • 移动窗口就是窗口向一端滑行,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。
  • Pandas中窗口方法rolling()
year_data = np.random.randn(365)
date_index = pd.date_range('2017-01-01', '2017-12-31', freq='D')
ser = pd.Series(year_data, date_index)
ser.head()

在这里插入图片描述

roll_window = ser.rolling(window=10)
roll_window

在这里插入图片描述

roll_window.mean()

在这里插入图片描述

import matplotlib.pyplot as plt

plt.plot(ser, '--')
ser_window = ser.rolling(window=10).mean()
plt.plot(ser_window)

在这里插入图片描述

参考来源

  1. How to handle time series data with ease
  2. 时间序列总结
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_泥鳅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值