python时间数据处理
本文详细介绍了Python在时间数据处理方面的应用,包括时间戳、时期等时间类型,date_range、时间数据重采样、时间滑动窗口等内容。文章通过实例展示了Python内置库和第三方库的强大功能,为高效处理时间数据提供了实用指南,适合各类数据分析和开发人员参考。
目录
在机器学习和深度学习的世界当中,存在众多经典且有效的(时间)序列模型。这些模型通常通过三种方式来建立样本与样本之间的关联:
ARIMA家族算法群:过去影响未来,因此未来的值由过去的值加权求和而成,以此构建样本与样本之间的关联。
循环网络家族:遍历时间点/样本点,将过去的时间上的信息传递存储在中间变量中,传递给下一个时间点,以此构建样本和样本之间的关联。
卷积网络家族:使用卷积核扫描时间点/样本点,将上下文信息通过卷积计算整合到一起,以此构建样本和样本之间的关联。
时间序列相关参考文章:
时间序列预测算法—ARIMA
时间序列预测算法—Prophet
时间序列预测算法—LSTM
长时间序列预测算法—Informer
时间序列分类任务—tsfresh
有季节效应的非平稳序列分析
python时间序列处理
时间序列异常值检测方法
时间序列异常值处理方法
一、时间类型
主要有以下几种:
(1)时间戳:表示特定时刻的数值
(2)时期:表示某个特定的时间段,通常包括开始和结束时间。
(3)时间间隔:表示两个时间点之间的持续时间,通常以天、小时、分钟等单位表示。
1.1、时间戳
t1=pd.Timestamp('2024-01-04')
t2=pd.Timestamp('2024-01-04 08')
t3=pd.Timestamp('2024-01-04 8:20')
print(t1,t2,t3)
1.2、时期
p1=pd.Period('2024-01-04')
p2=pd.Period('2024-01')
print(p1,p2)
tm=pd.period_range('2024-01-04 08:08',freq='1D1H',periods=10)
tm
指定索引
rng=pd.date_range('2024-01-02',periods=10,freq='D')
pd.Series(range(len(rng)),index=rng)
periods=pd.period_range('2024-01',freq='M',periods=3)
ts=pd.Series(np.random.randn(len(periods)),index=periods)
ts
time offsets
pt=pd.Period('2024-01-04 08:08')+pd.Timedelta('1 days')
tt=pd.Timestamp('2024-01-04 8:20')+pd.Timedelta('1 days')
print(pt,tt)
时间戳与时期转换
ts=pd.Series(range(10),pd.date_range('2024-01-04 08:08',periods=10,freq='H'))
ts_period=ts.to_period()
ts_period
1.3、字符串与datetime的相互转换
1.3.1、字符串转datetime
利用str或者strftime方法,datetime对象和pandas的时间戳对象可以被格式化为字符串。
from datetime import datetime
dt_str=datetime(2024,1,2)
str(dt_str)
dt_str.strftime("%Y-%m-%d")
1.3.2、datetime转字符串
利用strptime的方法
str_dt='2024-01-02'
datetime.strptime(str_dt,"%Y-%m-%d")
str_dt=['2024-01-02','2024-01-03','2024-01-04']
[datetime.strptime(x,"%Y-%m-%d") for x in str_dt]
1.3.3、parse方法
datetime.strptime是通过已知格式进行日期解析的最佳方式。但是每次都要编写格式定义,尤其是对于一些常见的日期格式,这种情况下,可以使用dateutil这个第三方包中的parser.parse方法。
from dateutil.parser import parse
parse('2022-01-02')
parse('Jan 30 2011 10:23 2:00 PM')
注意:parse可以解析很多日期表示形式,但是有时它会把一些原本不是日期的字符串认作是日期。
1.3.4、to_datetime方法
pandas最基本的时间序列类型就是以时间戳为索引的Series。
pandas通常是用于处理成组日期的,不管这些日期是DataFrame的轴索引还是列。to_datetime方法可以解析多种不同的日期表示形式。
import pandas as pd
str_dt=['2024-01-02','2024-01-03','2024-01-04']
pd.to_datetime(str_dt)
二、date_range
可以指定开始时间与周期。H:小时 .D:天 .M:月
df=pd.date_range('2024/1/4',periods=10,freq='H') #freq=D,M,H,3D
df
df=pd.date_range('2023/1/4','2024/1/4',freq='M') #freq=D,M,H,3D
df
freq常见参数
锚定偏移
具体可参考 https://blog.51cto.com/u_16099261/7139400
import datetime as dt # 导入 datetime 模块并命名为 dt
time=pd.Series(np.random.randn(10),index=pd.date_range(dt.datetime(2024,1,4),periods=10))
time
三、Truncate 过滤
time.truncate(before='2024-1-10')
time.truncate(after='2024-1-10')
四、时间数据重采样(resample)
时间数据由一个频率转换到另一个频率,主要分为:降采样和升采样
降采样:
rng=pd.date_range('2024/1/1',periods=90,freq='D')
ts=pd.Series(np.random.randn(len(rng)),index=rng)
ts.resample('M').sum() #M可以修改D或者3D等参数;sum()也可以修改mean()
升采样:插值方法
ffill:空值取前面的值
bfill:空值取后面的值
interpolate:线性取值
day3ts=ts.resample('3D').sum()
day3ts.resample('D').asfreq() #asfreq()将一个时间序列从一个频率转换为另一个频率
day3ts.resample('D').ffill(1)
day3ts.resample('D').interpolate('linear')
五、时间滑动窗口(rolling)
import numpy as np
import pandas as pd
df=pd.Series(np.random.randn(100),index=pd.date_range('2024-01-01',freq='D',periods=100))
rt=df.rolling(window=5)
rt.mean()
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(15,6))
df.plot(style='r--')
df.rolling(window=5).mean().plot(style='b')
六、数据预处理
6.1、处理缺失值
import pandas as pd
df = pd.DataFrame({"value": [1, None, 2, 3, None, 4]})
# 使用线性插值填充缺失值
df = df.interpolate(method='linear')
6.2、季节调整
时间序列数据中可能包含季节性变化,这会掩盖数据的真实趋势。季节性调整是一种方法,可以去除数据中的季节性效应,使得趋势更加明显。
import statsmodels.api as sm
df = pd.DataFrame({"value": [11,5,8,14,5,9,7,18,13,20,11,18]})
# 进行季节性分解
res = sm.tsa.seasonal_decompose(df.value, model='additive', period=3) #加法模型,还有乘法模型
# 季节性调整
df_deseasonalized = df.value - res.seasonal
df_deseasonalized
6.3、去噪
时间序列数据可能包含噪声,这可能会影响预测的准确性。去噪方法可能包括平滑技术(如:移动平均法)或者更复杂的方法(如:滤波器)
df = pd.DataFrame({"value": [11,5,8,14,5,9,7,18,13,20,11,18]})
# 使用移动平均方法去噪
df_smooth = df.value.rolling(window=3).mean()
df_smooth
更多推荐
所有评论(0)