我有连续的 NaN 值。我想从连续的 NaN 值周期计算 NaN 值,我还想要 NaN 值的连续周期的开始和结束日期。
df :
TMIN
2017-01-01 00:00:00 2.5
2017-01-02 00:00:00 NaN
2017-01-03 00:00:00 NaN
2017-01-04 00:00:00 2.2
2018-01-01 00:00:00 NaN
2018-01-02 00:00:00 NaN
2018-01-03 00:00:00 NaN
2018-01-04 00:00:00 5.0
2019-01-01 00:00:00 9.0
2019-01-02 00:00:00 8.0
2019-01-03 00:00:00 2.0
2019-01-04 00:00:00 NaN
2020-01-01 00:00:00 NaN
2020-01-02 00:00:00 NaN
2020-01-03 00:00:00 1.0
2020-01-04 00:00:00 NaN
Expected results :
Start_Date End date number of contiguous missing values
2017-01-02 00:00:00 2017-01-03 00:00:00 2
2018-01-01 00:00:00 2018-01-03 00:00:00 3
2019-01-04 00:00:00 2019-01-04 00:00:00 1
2020-01-01 00:00:00 2020-01-02 00:00:00 2
2020-01-04 00:00:00 2020-01-04 00:00:00 1
我该如何解决这个问题?提前致谢。
最佳答案
代码:
s = df.index.to_series()
m1, m2 = s.diff().dt.days.eq(1), df['TMIN'].isna()
out = s[m2].groupby([(~m1).cumsum(), (~m2).cumsum()])\
.agg(['first', 'last', 'count']).reset_index(drop=True)
详情:
创建 bool 掩码 m1
和 m2
这样 m1
表示连续日期之间的差异为 1 days
的条件和 m2
表示列 TMIN
所在的条件包含 NaN
值(value)观:
>>> m1
2017-01-01 False
2017-01-02 True
2017-01-03 True
2017-01-04 True
2018-01-01 False
2018-01-02 True
2018-01-03 True
2018-01-04 True
2019-01-01 False
2019-01-02 True
2019-01-03 True
2019-01-04 True
2020-01-01 False
2020-01-02 True
2020-01-03 True
2020-01-04 True
dtype: bool
>>> m2
2017-01-01 False
2017-01-02 True
2017-01-03 True
2017-01-04 False
2018-01-01 True
2018-01-02 True
2018-01-03 True
2018-01-04 False
2019-01-01 False
2019-01-02 False
2019-01-03 False
2019-01-04 True
2020-01-01 True
2020-01-02 True
2020-01-03 False
2020-01-04 True
Name: TMIN, dtype: bool
使用 cumsum
用上面的 bool 掩码来识别连续的 block dates
和 NaN
值(value)观:
>>> (~m1).cumsum()
2017-01-01 1
2017-01-02 1
2017-01-03 1
2017-01-04 1
2018-01-01 2
2018-01-02 2
2018-01-03 2
2018-01-04 2
2019-01-01 3
2019-01-02 3
2019-01-03 3
2019-01-04 3
2020-01-01 4
2020-01-02 4
2020-01-03 4
2020-01-04 4
dtype: int64
>>> (~m2).cumsum()
2017-01-01 1
2017-01-02 1
2017-01-03 1
2017-01-04 2
2018-01-01 2
2018-01-02 2
2018-01-03 2
2018-01-04 3
2019-01-01 4
2019-01-02 5
2019-01-03 6
2019-01-04 6
2020-01-01 6
2020-01-02 6
2020-01-03 7
2020-01-04 7
Name: TMIN, dtype: int64
最后group
index
上述 block 上的 datframe 并使用 first
聚合, last
和 count
得到结果:
>>> out
first last count
0 2017-01-02 2017-01-03 2
1 2018-01-01 2018-01-03 3
2 2019-01-04 2019-01-04 1
3 2020-01-01 2020-01-02 2
4 2020-01-04 2020-01-04 1
关于python - 计算连续的 NaN 值并获取 NaN 连续期间的开始和结束日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66426653/