首页 > 解决方案 > 检查我的时间序列索引数据是否有工作日的任何缺失值

问题描述

我有从“2015 年 1 月 5 日”到“2018 年 12 月 28 日”的时间序列数据。我观察到了一些工作日的日期,它们的值丢失了。如何检查我的时间范围内缺少多少个工作日?这些日期是什么,以便我可以推断这些日期的值。

例子:

Date    Price    Volume
2018-12-28  172.0   800
2018-12-27  173.6   400
2018-12-26  170.4   500
2018-12-25  171.0   2200
2018-12-21  172.8   800

在观察日历上,2018 年 12 月 21 日是星期五。然后不包括周六和周日,数据集应该在列表中有“2018 年 12 月 24 日”,但它缺失了。我需要从范围中识别出这些缺失的日期。

到目前为止我的方法:我尝试使用

pd.date_range('2015-01-05','2018-12-28',freq='W')

确定周数并计算周数。手动从他们那里获得工作日的数量,以识别缺失日期的数量。但它解决了目的,因为我需要从范围内识别缺失的日期。

标签: pythontime-seriesmissing-datadata-cleaning

解决方案


假设这是您的完整数据集:

Date    Price    Volume
2018-12-28  172.0   800
2018-12-27  173.6   400
2018-12-26  170.4   500
2018-12-25  171.0   2200
2018-12-21  172.8   800

并且dates是:

dates = pd.date_range('2018-12-15', '2018-12-31')

首先,确保 Date 列实际上是一个日期类型:

df['Date'] = pd.to_datetime(df['Date'])

然后将 Date 设置为索引:

df = df.set_index('Date')

然后用 unutbu 的解决方案重新索引

df = df.reindex(dates, fill_value=0.0)

然后重置索引以使其更易于使用:

df = df.reset_index()

现在看起来像这样:

        index  Price  Volume
0  2018-12-15    0.0     0.0
1  2018-12-16    0.0     0.0
2  2018-12-17    0.0     0.0
3  2018-12-18    0.0     0.0
4  2018-12-19    0.0     0.0
5  2018-12-20    0.0     0.0
6  2018-12-21  172.8   800.0
7  2018-12-22    0.0     0.0
8  2018-12-23    0.0     0.0
9  2018-12-24    0.0     0.0
10 2018-12-25  171.0  2200.0
11 2018-12-26  170.4   500.0
12 2018-12-27  173.6   400.0
13 2018-12-28  172.0   800.0
14 2018-12-29    0.0     0.0
15 2018-12-30    0.0     0.0
16 2018-12-31    0.0     0.0

做:

df['weekday'] = df['index'].dt.dayofweek

最后,您的时间范围内缺少多少个工作日:

missing_weekdays = df[(~df['weekday'].isin([5,6])) & (df['Volume'] == 0.0)]

结果:

>>> missing_weekdays
        index  Price  Volume  weekday
2  2018-12-17    0.0     0.0        0
3  2018-12-18    0.0     0.0        1
4  2018-12-19    0.0     0.0        2
5  2018-12-20    0.0     0.0        3
9  2018-12-24    0.0     0.0        0
16 2018-12-31    0.0     0.0        0

推荐阅读