Python 对连续的NaN值进行计数,并获取NaN连续期间的开始日期和结束日期
我有连续的NaN值周期。我想从连续NaN值的时段中计算NaN值,还想计算NaN值的连续时段的开始和结束日期Python 对连续的NaN值进行计数,并获取NaN连续期间的开始日期和结束日期,python,pandas,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
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
我怎样才能解决这个问题?提前感谢。用更多的iTrool(标准python库)尝试一些不同的东西
代码:
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)
详细信息:
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)
创建布尔掩码m1
和m2
,以便m1
表示连续日期之间的差值为1天的情况,而m2
表示列TMIN
包含NaN
值的情况:
>>> 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
>>> (~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
将cumsum
与上述布尔掩码一起使用,以识别连续日期
和NaN
值块:
>>> 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
>>> (~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
最后,对上述块上的数据帧的索引进行分组
,并使用第一个
、最后一个
和计数
进行聚合,以获得结果:
>>> 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
@ALollz srry为这些观点辩护。你可以忽略它们。这些点意味着该行下面有更多的数据。如何定义nan
值的连续周期?连续日期之间的差值是否需要1
天?