首页 > 解决方案 > 识别 t > n 天未输入数据的实例 [python]

问题描述

我正在寻找一种方法来识别数天未输入数据的实例。就我而言,我想标记超过 5 天没有输入数据的情况。

可以在此表中找到数据集类型的示例:https ://i.stack.imgur.com/j0s86.png

我尝试了多种方法,包括用日期变量替换缺失的数据并减去差异,但未能提出任何有用的方法。

最新代码:

df = 'table.csv'

df['Rolling'] = np.roll(df['Count'],1)

df['Count'] = df['Count'].fillna('MISSING')
df.loc[ df['Count'] == 'MISSING', 'Count'] = df['Date']
diff = df['Count'].astype('int32') - df['Rolling'].astype('int32')
df['Difference'] = diff

df.head()

接下来我一直在尝试(并且失败)尝试的是创建一个新列,该列仅包含输入数据的日期,并使用它来尝试计算差异。

与往常一样,非常感谢任何帮助。

-C

标签: pythonpandasdatetimemissing-dataflags

解决方案


在提出答案之前,我想向您指出这篇非常有用的文章:如何提供一个很棒的 pandas 示例,因此想要回答您问题的人可以直接使用您的数据框

如果没有,这里是我使用的示例数据框:

import numpy as np
from datetime import datetime,timedelta
start_date = datetime(2015,11,4)
dates = [start_date + timedelta(days =x) for x in range(20)]
count = [np.nan]*len(dates)
count[9] = 10
count[11] = 20
count[17] = 30
df = pd.DataFrame({'Date':dates, 'Obs':count})
df

看起来像这样

    Date        Obs
0   2015-11-04  NaN
1   2015-11-05  NaN
2   2015-11-06  NaN
3   2015-11-07  NaN
4   2015-11-08  NaN
5   2015-11-09  NaN
6   2015-11-10  NaN
7   2015-11-11  NaN
8   2015-11-12  NaN
9   2015-11-13  10.0
10  2015-11-14  NaN
11  2015-11-15  20.0
12  2015-11-16  NaN
13  2015-11-17  NaN
14  2015-11-18  NaN
15  2015-11-19  NaN
16  2015-11-20  NaN
17  2015-11-21  30.0
18  2015-11-22  NaN
19  2015-11-23  NaN

请注意,我假设您有 NaN 用于有数据的日期

所以我们可以做以下事情——我们可以对非 NaN 观察对象之间的所有块进行分组,这是通过(~df['Count'].isna()).cumsum())下面的计算来实现的——这个系列在检测到非 NaN 'Count' 的索引处递增。一旦我们对其进行分组,我们就可以获得有关组的一些统计信息。所以

df.groupby((~df['Obs'].isna()).cumsum()).agg({'Date':['first','last', 'count']})

生产

    Date
    first       last        count
Obs
0   2015-11-04  2015-11-12  9
1   2015-11-13  2015-11-14  2
2   2015-11-15  2015-11-20  6
3   2015-11-21  2015-11-23  3

阅读本文的方式是第一块 NaN 从 2015-11-04 到 2015-11-12 有 9 个条目,第二个从 2015-11-13 到 2015-11-14 有 2 个,等等(内部块将包括实际观察结果之一,因此 NaN 的 # 是“计数”-1)。所以你可以看到哪个块长于 5(或其他),并且你知道它什么时候开始和结束


推荐阅读