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

标签 python pandas

我有连续的 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/

相关文章:

python - 删除 PANDAS 中的第二行标题

python - 使用 df.apply 处理异常

pandas HDFStore 按日期时间索引选择行

Python正则表达式如果在同一正则表达式字符串中匹配多个条件

python - 用python检测关机事件

python - 打开扭曲套接字客户端的 Django 命令留下空闲数据库连接

python - Numba 使 python 代码在一个简单的 for 循环中运行得更慢(不使用 numpy)

python - 使用 pandas read_csv 读取这个以制表符分隔的文件时,行丢失

python - 让 Nose 无法通过慢速测试

python - 将 iloc 与 pandas styler 结合使用