在执行差异函数时如何仅在数据不为零或不考虑零后的第一个和最后一个值时执行

While performing a diff function how to only perform when the data is not zero or not to consider the first and last value after a zero

我有一个数据框 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