目录
# 开篇
1. 创建和操作时间序列对象
2. 时间序列数据的读取和存储
3. 时间序列数据的索引和切片
4. 时间序列数据的操作和转换
5. 时间序列数据的可视化
6. 处理时间序列中的缺失值
7. 时间序列数据的聚合和分组
8. 时间序列的时间区间和偏移量操作
示例代码:
运行结果:
# 开篇
在Python中,时间序列是一种特殊的数据类型,通常用于表示一系列按时间顺序排列的数据点。时间序列可以是一维数组,其中每个数据点都和一个特定的时间点相关联。
时间序列在数据分析和预测中非常重要,因为它们可以帮助我们理解数据随时间变化的模式和趋势。通过对时间序列数据进行分析,我们可以发现周期性变化、趋势、季节性等特征,并基于这些特征进行预测和决策。
在Python中,有许多用于处理时间序列数据的库,如pandas、numpy、matplotlib等。这些库提供了丰富的功能和工具,可以帮助我们加载、处理、可视化和分析时间序列数据。
总的来说,时间序列在Python中的作用主要包括:
- 数据分析和预测:通过对时间序列数据进行分析,可以揭示数据的模式和趋势,从而进行预测和决策。
- 可视化:通过绘制时间序列图表,可以直观地展示数据随时间的变化,帮助我们理解数据的特征和规律。
- 数据处理和转换:可以利用时间序列数据进行数据清洗、转换和处理,以便更好地进行后续的分析和建模工作。
- 特征工程:时间序列数据可以用于构建特征,帮助机器学习模型更好地理解数据和进行预测。
总的来说,时间序列在Python中是一种非常重要的数据类型,可以帮助我们更好地理解和分析数据,从而做出更准确的预测和决策。
1. 创建和操作时间序列对象
- 使用
pd.date_range
、pd.to_datetime
和pd.Timestamp
创建时间索引。 -
DatetimeIndex
是 Pandas 时间序列的核心。
import pandas as pd
# 创建时间序列
date_rng = pd.date_range(start='2023-01-01', end='2023-06-30', freq='D')
data = pd.DataFrame(date_rng, columns=['日期'])
data.set_index('日期', inplace=True)
2. 时间序列数据的读取和存储
- 使用
read_csv
、read_excel
等方法读取带有日期时间数据的文件,并使用parse_dates
参数进行解析。 - 保存时间序列数据到文件中,例如使用
to_csv
、to_excel
等。
# 读取时间序列数据
data = pd.read_csv('data.csv', parse_dates=['日期'], index_col='日期')
# 保存时间序列数据
data.to_csv('output.csv')
3. 时间序列数据的索引和切片
- 基于时间索引的切片和子集选择,例如
data['2023-01-01':'2023-02-01']
。 - 使用
resample
方法进行重采样。
# 时间索引切片
subset = data['2023-01-01':'2023-02-01']
# 重采样
monthly_data = data.resample('M').mean()
4. 时间序列数据的操作和转换
- 使用
shift
、rolling
和expanding
方法进行移动窗口操作和滚动计算。 - 使用
diff
计算差分。 - 使用
resample
进行频率转换和聚合操作。
# 滚动计算
data['7天滚动平均'] = data['值'].rolling(window=7).mean()
# 差分计算
data['差分'] = data['值'].diff()
# 重采样聚合
weekly_data = data.resample('W').sum()
5. 时间序列数据的可视化
- 使用 ECharts(通过 pyecharts)绘制时间序列数据的图表。
from pyecharts.charts import Line
from pyecharts import options as opts
# 时间序列数据的可视化
line = (
Line(init_opts=opts.InitOpts(width="1000px", height="600px")) # 设置图表的宽度和高度
.add_xaxis(data.index.strftime('%Y-%m-%d').tolist())
.add_yaxis("每日温度", data['温度'].tolist(), is_smooth=True, label_opts=opts.LabelOpts(is_show=False))
.add_yaxis("7天滚动平均", data['7天滚动平均'].tolist(), is_smooth=True, label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(
title="温度时间序列数据",
pos_top="5%",
pos_left="center"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axislabel_opts=opts.LabelOpts(rotate=-15) # 旋转x轴标签
),
yaxis_opts=opts.AxisOpts(type_="value"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
legend_opts=opts.LegendOpts(
pos_top="10%", # 设置图例的位置
pos_left="center",
orient="horizontal"
)
)
)
6. 处理时间序列中的缺失值
- 使用
fillna
、interpolate
和dropna
方法处理缺失数据。
# 填充缺失值
data['值'].fillna(method='ffill', inplace=True)
# 插值填充
data['值'].interpolate(method='linear', inplace=True)
# 删除缺失值
data.dropna(inplace=True)
7. 时间序列数据的聚合和分组
- 使用
groupby
和resample
方法对时间序列数据进行分组和聚合。
# 按月分组聚合
monthly_grouped = data.groupby(data.index.month).sum()
# 重采样聚合
quarterly_data = data.resample('Q').mean()
8. 时间序列的时间区间和偏移量操作
- 使用
pd.offsets
模块中的类进行自定义时间偏移量操作。
# 自定义时间偏移量
data.index = data.index + pd.offsets.Day(1)
示例代码:
import pandas as pd
import numpy as np
from pyecharts.charts import Line
from pyecharts import options as opts
# 1. 创建时间序列数据
date_rng = pd.date_range(start='2023-01-01', end='2023-06-30', freq='D')
data = pd.DataFrame(date_rng, columns=['日期'])
print("\n日期:")
print(data)
data['温度'] = np.random.randint(0, 35, size=(len(date_rng)))
print("\n温度:")
print(data)
data.set_index('日期', inplace=True)
# 2. 读取和存储时间序列数据
data.to_csv('temperature_data.csv')
data = pd.read_csv('temperature_data.csv', parse_dates=['日期'], index_col='日期')
# 3. 时间序列数据的索引和切片
subset = data['2023-01-01':'2023-02-01']
monthly_data = data.resample('ME').mean() # 修改 'M' 为 'ME'
# 4. 时间序列数据的操作和转换
data['7天滚动平均'] = data['温度'].rolling(window=7).mean()
data['温度差分'] = data['温度'].diff()
weekly_data = data.resample('W').mean()
print("\n7天滚动平均/温度差分:")
print(data)
# 5. 时间序列数据的可视化
line = (
Line(init_opts=opts.InitOpts(width="1000px", height="600px")) # 设置图表的宽度和高度
.add_xaxis(data.index.strftime('%Y-%m-%d').tolist())
.add_yaxis("每日温度", data['温度'].tolist(), is_smooth=True, label_opts=opts.LabelOpts(is_show=False))
.add_yaxis("7天滚动平均", data['7天滚动平均'].tolist(), is_smooth=True, label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(
title="温度时间序列数据",
pos_top="5%",
pos_left="center"
),
xaxis_opts=opts.AxisOpts(
type_="category",
axislabel_opts=opts.LabelOpts(rotate=-15) # 旋转x轴标签
),
yaxis_opts=opts.AxisOpts(type_="value"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
legend_opts=opts.LegendOpts(
pos_top="10%", # 设置图例的位置
pos_left="center",
orient="horizontal"
)
)
)
line.render("temperature_time_series.html")
# 6. 处理时间序列中的缺失值
data.loc['2023-02-15':'2023-02-20', '温度'] = np.nan
data.loc[:, '温度'] = data['温度'].ffill() # 使用 obj.ffill() 替换 fillna
data.loc[:, '温度'] = data['温度'].interpolate(method='linear')
print("\n处理缺失值: ")
print(data)
# 7. 时间序列数据的聚合和分组
monthly_grouped = data.groupby(data.index.month).mean()
quarterly_data = data.resample('QE').mean() # 修改 'Q' 为 'QE'
print("\n月度数据:")
print(monthly_grouped)
print("\n季度数据:")
print(quarterly_data)
# 8. 时间序列的时间区间和偏移量操作
data.index = data.index + pd.offsets.Day(1)
print("\n时间区间和偏移量操作:")
print(data)
运行结果:
日期:
日期
0 2023-01-01
1 2023-01-02
2 2023-01-03
3 2023-01-04
4 2023-01-05
.. ...
176 2023-06-26
177 2023-06-27
178 2023-06-28
179 2023-06-29
180 2023-06-30
[181 rows x 1 columns]
温度:
日期 温度
0 2023-01-01 25
1 2023-01-02 10
2 2023-01-03 24
3 2023-01-04 23
4 2023-01-05 17
.. ... ..
176 2023-06-26 22
177 2023-06-27 29
178 2023-06-28 6
179 2023-06-29 6
180 2023-06-30 24
[181 rows x 2 columns]
7天滚动平均/温度差分:
温度 7天滚动平均 温度差分
日期
2023-01-01 25 NaN NaN
2023-01-02 10 NaN -15.0
2023-01-03 24 NaN 14.0
2023-01-04 23 NaN -1.0
2023-01-05 17 NaN -6.0
... .. ... ...
2023-06-26 22 21.142857 -5.0
2023-06-27 29 22.714286 7.0
2023-06-28 6 20.142857 -23.0
2023-06-29 6 19.571429 0.0
2023-06-30 24 18.285714 18.0
[181 rows x 3 columns]
处理缺失值:
温度 7天滚动平均 温度差分
日期
2023-01-01 25.0 NaN NaN
2023-01-02 10.0 NaN -15.0
2023-01-03 24.0 NaN 14.0
2023-01-04 23.0 NaN -1.0
2023-01-05 17.0 NaN -6.0
... ... ... ...
2023-06-26 22.0 21.142857 -5.0
2023-06-27 29.0 22.714286 7.0
2023-06-28 6.0 20.142857 -23.0
2023-06-29 6.0 19.571429 0.0
2023-06-30 24.0 18.285714 18.0
[181 rows x 3 columns]
月度数据:
温度 7天滚动平均 温度差分
日期
1 14.290323 12.725714 -0.233333
2 22.821429 20.678571 -0.321429
3 18.419355 18.801843 0.322581
4 18.333333 17.666667 0.366667
5 17.193548 18.064516 -0.967742
6 20.500000 20.085714 0.800000
季度数据:
温度 7天滚动平均 温度差分
日期
2023-03-31 18.366667 17.619048 -0.067416
2023-06-30 18.659341 18.599686 0.054945
时间区间和偏移量操作:
温度 7天滚动平均 温度差分
日期
2023-01-02 25.0 NaN NaN
2023-01-03 10.0 NaN -15.0
2023-01-04 24.0 NaN 14.0
2023-01-05 23.0 NaN -1.0
2023-01-06 17.0 NaN -6.0
... ... ... ...
2023-06-27 22.0 21.142857 -5.0
2023-06-28 29.0 22.714286 7.0
2023-06-29 6.0 20.142857 -23.0
2023-06-30 6.0 19.571429 0.0
2023-07-01 24.0 18.285714 18.0
[181 rows x 3 columns]