在执行diff函数时,如何仅在数据不为零时执行,或者不考虑零后的第一个和最后一个值 如果有效数据范围内没有零:否则,让我们找到有效数据范围的开始和结束:

问题描述

enter image description here

我有一个数据框X,该数据框始终以零开头并以零结尾,因此我在sun列上执行了.diff()函数,以获取当前间隔与其之间的差上一个时间间隔,当我这样做时,我在数据帧Y中的一天开始和一天结束时获得了这个大值,并以黄色标记,我试图查看如何计算3:30时间与戳,以便得到一个数据帧z,其中的零而不是100和-142

解决方法

如果有效数据范围内没有零:

df.loc[~df['sun'].eq(0),'sun'].diff().fillna(0).reindex(df.index,fill_value=0)

输出:

2020-07-20 03:05:00     0.0
2020-07-20 03:10:00     0.0
2020-07-20 03:15:00     0.0
2020-07-20 03:20:00     0.0
2020-07-20 03:25:00     0.0
2020-07-20 03:30:00    21.0
2020-07-20 03:35:00     1.0
2020-07-20 03:40:00    12.0
2020-07-20 03:45:00   -12.0
2020-07-20 03:50:00    20.0
2020-07-20 03:55:00     0.0
2020-07-20 04:00:00     0.0
2020-07-20 04:05:00     0.0
Freq: 5T,Name: sun,dtype: float64

否则,让我们找到有效数据范围的开始和结束:

s = df.where(df['sun'].ne(0))
idx_start = s.first_valid_index()
idx_end = s.last_valid_index()
df.loc[idx_start:idx_end].diff().fillna(0).reindex(df.index,fill_value=0)

输出:

                      sun
2020-07-20 03:05:00   0.0
2020-07-20 03:10:00   0.0
2020-07-20 03:15:00   0.0
2020-07-20 03:20:00   0.0
2020-07-20 03:25:00   0.0
2020-07-20 03:30:00  21.0
2020-07-20 03:35:00   1.0
2020-07-20 03:40:00  12.0
2020-07-20 03:45:00 -12.0
2020-07-20 03:50:00  20.0
2020-07-20 03:55:00   0.0
2020-07-20 04:00:00   0.0
2020-07-20 04:05:00   0.0