gpt4 book ai didi

python - 识别非连续零的索引值

转载 作者:行者123 更新时间:2023-12-02 06:45:47 24 4
gpt4 key购买 nike

我有一个负数和零的 pandas 数据框,带有日期时间索引。

我希望能够:(1) 确定非连续、非零值的开始日期和结束日期;(2) 这两个日期之间的天数;(3) 这两个日期之间的最小值

例如,如果我的数据框如下所示:

DATE        VAL  
2007-06-26 0.000000
2007-06-27 0.000000
2007-06-28 0.000000
2007-06-29 -0.006408
2007-07-02 0.000000
2007-07-03 0.000000
2007-07-04 -0.000003
2007-07-05 0.000000
2007-07-06 0.000000
2007-07-09 0.000000
2007-07-10 -0.018858
2007-07-11 -0.015624
2007-07-12 0.000000
2007-07-13 0.000000
2007-07-16 -0.008562
2007-07-17 -0.006587

我想要如下所示的输出:

START        END          DAYS  MIN
2007-06-29 2007-06-29 1 -0.006408
2007-07-04 2007-07-04 1 -0.000003
2007-07-10 2007-07-11 2 -0.018858
2007-07-16 2007-07-17 2 -0.008562

如果天数不包括周末(即 7/13 到 7/16 算作 1 天),那就更好了,但我意识到这通常很复杂。

numpy.argmax/min 方法似乎做了我想要的一个版本,但根据文档设置 axis=1 没有返回集合我预期的指数值。

编辑:应该指定,寻找不需要循环的解决方案。

最佳答案

解决方案 named-aggregation在 pandas 0.25+ 中工作:

#convert DatetimeIndex to column
df = df.reset_index()
#filter values equal 0
m = df['VAL'].eq(0)
#create groups only for non 0 rows filtering with inverting mask by ~
g = m.ne(m.shift()).cumsum()[~m]
#aggregation by groups
df1 = df.groupby(g).agg(START=('DATE','first'),
END=('DATE','last'),
DAYS= ('DATE', 'size'),
MIN=('VAL','min')).reset_index(drop=True)
print (df1)
START END DAYS MIN
0 2007-06-29 2007-06-29 1 -0.006408
1 2007-07-04 2007-07-04 1 -0.000003
2 2007-07-10 2007-07-11 2 -0.018858
3 2007-07-16 2007-07-17 2 -0.008562

pandas 的解决方案 <0.25 可以通过将字典传递给 agg 和最后设置的新列名称来实现:

df = df.reset_index()
m = df['VAL'].eq(0)
g = m.ne(m.shift()).cumsum()[~m]

df1 = df.groupby(g).agg({'DATE':['first','last','size'], 'VAL':'min'}).reset_index(drop=True)
df1.columns = ['START','END','DAYS','MIN']
print (df1)
START END DAYS MIN
0 2007-06-29 2007-06-29 1 -0.006408
1 2007-07-04 2007-07-04 1 -0.000003
2 2007-07-10 2007-07-11 2 -0.018858
3 2007-07-16 2007-07-17 2 -0.008562

关于python - 识别非连续零的索引值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59915959/

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