gpt4 book ai didi

python - 计算连续的 NaN 值并获取 NaN 连续期间的开始和结束日期

转载 作者:行者123 更新时间:2023-12-04 02:27:37 25 4
gpt4 key购买 nike

我有连续的 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 掩码 m1m2这样 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 datesNaN值(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 聚合, lastcount得到结果:

>>> 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com