时间序列数据中缺失日期的处理

数据分析领域,尤其是处理时间序列数据时,缺失日期的问题对整体分析和数据可视化有着重要影响。如果未对缺失日期进行处理,许多时间序列机器学习模型的性能将受到影响。因此,必须仔细处理这些缺失的日期,并确保数据通过适当的日期插补重新排列。本文将解释如何在Python项目中插补缺失的日期。

插补缺失日期的方法

插补缺失日期的方法取决于获取的数据类型。时间序列数据可以是每月、每周甚至每天的数据。本文将通过所有这些场景,识别数据中的缺失日期,并编写相应的代码来插补这些缺失的日期。将使用Python的Pandas库来完成这项工作。

学习目标

识别缺失日期

学习如何插补日期

处理日、周或月数据中的缺失日期

目录

  • 日数据中缺失日期的插补
  • 周数据中缺失日期的插补
  • 月数据中缺失日期的插补

日数据中缺失日期的插补

本节将讨论如何识别和插补包含日日期的数据。使用的示例数据集包含每日温度数据。第一步是将日期列转换为datetime数据类型。可以使用Pandas库中的to_datetime()方法来实现。然后将日期列设置为索引。以下是如何更改日期列的数据类型并查看数据集的示例。

import pandas as pd df_daily = pd.read_excel("/content/daily_date.xlsx") df_daily.index = pd.to_datetime(df_daily.index)

在上面的图像中,可以看到所采用的数据集。日期范围从2020年1月15日到2020年1月27日。可以看到数据中包含了缺失的日期,如14日、19日、20日等。

下一步是存储数据集的开始和结束日期。有了这些,可以使用Pandas中的date_range()函数从开始日期到结束日期生成每日日期。让看看它的实现。

start = df_daily.index[0].date() end = df_daily.index[len(df_daily)-1].date() new_dates = pd.date_range(start=start, end=end, freq='D')

start变量包含日期2020-01-15,end变量包含日期2020-01-27。这些开始和结束日期作为参数传递给date_range()方法。由于处理的是每日数据,指定频率为'D'。

生成的日期存储在new_dates变量中。输出显示的是new_dates变量的内容。

最后,已经生成了新的日期。下一步是使用reindex()方法将这些新日期与旧日期在每日温度数据中重新索引。

df_daily = df_daily.reindex(new_dates) df_daily = df_daily.rename_axis('date') print(df_daily)

最终,日期已经被插补。从上面的图片中可以看到,缺失的日期已经被添加。当添加缺失的日期时,其他列的对应值将是NaN。这些可以通过不同的方式插补。这里不讨论这个问题。只讨论缺失的日期。

周数据中缺失日期的插补

本节将处理包含缺失日期的周数据。这与处理缺失的日数据问题非常相似。首先,使用Pandas的to_datetime()将日期转换为datetime类型。然后存储数据中的第一个和最后一个日期在start和end变量中。然后使用data_range()获取新的日期并重新索引到数据框中。

df_weekly = pd.read_excel("/content/weekly.xlsx") df_weekly.index = pd.to_datetime(df_weekly.index, infer_datetime_format=True) start = df_weekly.index[0].date() end = df_weekly.index[len(df_weekly)-1].date() new_dates = pd.date_range(start=start, end=end, freq='7D') df_weekly = df_weekly.reindex(new_dates) df_weekly = df_weekly.rename_axis('date')

在上面的代码中,对于to_datetime()函数,使用了infer_datetime_format=True。这个函数确定2020-11-14中哪部分属于月份,哪部分属于天,哪部分属于年份。从输出图像中,可以看到缺失的日期已经被插补,同时NaN值被放置在缺失的列中。

需要注意的一点是,在date_range()函数中,使用了'7D'作为频率而不是'w'。'w'是可以使用的频率,用于生成每周日期。'7D'也是一样的;它生成的日期间隔为7天。

但主要的区别是,当使用'w'时,日期以不同的格式生成。例如,在这个数据中,第一天是2022年11月14日,这是星期一,第二天生成的必须是11月21日。但是使用'w',第一天创建的是11月20日。因为'w'生成的日期必须从周的开始那天开始,即星期日。由于11月20日是星期日,'w'将从星期日开始生成日期,所以生成的日期将是11月20日、11月27日等。因此,使用'7D'而不是'w'更好,它将正确生成日期。

在本节中,将最终处理包含缺失日期的月数据。如果已经找到了插补月数据中缺失日期的方法,那很好。如果没有,不用担心。

像往常一样,首先,使用Pandas的to_datetime()将日期转换为datetime类型。然后存储数据中的第一个和最后一个日期在start和end变量中。然后使用data_range()获取新的日期,然后重新索引到DataFrame中。

df_monthly = pd.read_excel("/content/monthly.xlsx") df_monthly.index = pd.to_datetime(df_monthly.index, format="%d-%m-%Y") start = df_monthly.index[0].date() end = df_monthly.index[len(df_monthly)-1].date() new_dates = pd.date_range(start=start, end=end, freq='MS') df_monthly = df_monthly.reindex(new_dates) df_monthly = df_monthly.rename_axis('date')
  • 使用to_datetime()方法将日期列类型转换为Pandasdatetime类型,然后进一步用于插补缺失日期。
  • date_range()方法可以用来为给定的开始和结束日期生成日期,并且可以修改生成日期的频率。
  • reindex()方法用于将旧日期列与包含缺失日期的新日期列重新索引。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485