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