确定在 t > n 天内未输入数据的实例 [python]
Identify instances where data NOT entered for t > n days [python]
我正在寻找一种方法来识别多日未输入数据的实例。就我而言,我想在超过 5 天没有输入数据时进行标记。
可以在 table 中找到数据集类型的示例: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
在提出答案之前,我想向您指出这篇非常有用的文章:how to provide a great pandas example,因此想要回答您问题的人可以直接使用您的数据框
如果没有,这里是我使用的示例数据框:
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 [=30] 的索引处递增=] 被检测到。一旦我们对其进行分组,我们就可以获得有关组的一些统计信息。所以
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 的数量为 'count'-1)。所以你可以看到哪个块长于 5(或其他),并且你知道它何时开始和结束
我正在寻找一种方法来识别多日未输入数据的实例。就我而言,我想在超过 5 天没有输入数据时进行标记。
可以在 table 中找到数据集类型的示例: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
在提出答案之前,我想向您指出这篇非常有用的文章:how to provide a great pandas example,因此想要回答您问题的人可以直接使用您的数据框
如果没有,这里是我使用的示例数据框:
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 [=30] 的索引处递增=] 被检测到。一旦我们对其进行分组,我们就可以获得有关组的一些统计信息。所以
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 的数量为 'count'-1)。所以你可以看到哪个块长于 5(或其他),并且你知道它何时开始和结束