Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算列在还原为0之前为正值的时间量_Python_Pandas_Datetime_Datetimeindex - Fatal编程技术网

Python 计算列在还原为0之前为正值的时间量

Python 计算列在还原为0之前为正值的时间量,python,pandas,datetime,datetimeindex,Python,Pandas,Datetime,Datetimeindex,我有一个表,其中包含针对datetimeindex的非负值,如下所示: CapturableSeparation date 2021-02-23 18:09:00 0.00 2021-02-23 18:10:00 0.00 2021-02-23 18:11:00 0.04 2021-02-23 18:12:00 0.04 2021-02-23 18:13:00 0.00 ... ... 2021-02-25 23:56:00 0.00 2021-0

我有一个表,其中包含针对datetimeindex的非负值,如下所示:

                    CapturableSeparation
date    
2021-02-23 18:09:00 0.00
2021-02-23 18:10:00 0.00
2021-02-23 18:11:00 0.04
2021-02-23 18:12:00 0.04
2021-02-23 18:13:00 0.00
... ...
2021-02-25 23:56:00 0.00
2021-02-25 23:57:00 0.91
2021-02-25 23:58:00 0.74
2021-02-25 23:59:00 0.55
我想创建一个非连续0之间的时间量表(正值在恢复为0之前持续的时间量),并在这些连续正值期间使用“CapturableSeparation”的平均值进行键控。对于可见的数据,该表可能如下所示:

                    AvgValue
persistence 
00:02:00            0.04
00:03:00            0.73
其中,第一行对应于数据帧开始处持续2分钟的正值,第二行对应于结束处持续3分钟的正值


应该如何做到这一点?

这里有一种解决问题的方法,通过使用布尔掩蔽和
cumsum
识别非零值的连续块:

m = df['CapturableSeparation'].eq(0)
b = m.cumsum()[~m]
agg_dict = {'persistence': ('date', np.ptp), 
            'avgvalue'   : ('CapturableSeparation', 'mean')}

out = df.groupby(b, as_index=False).agg(**agg_dict)
out['persistence'] += pd.Timedelta(minutes=1)
详细信息:

比较
CapturableSeparation
列与
0
以创建布尔掩码:

>>> m

0     True
1     True
2    False
3    False
4     True
5     True
6    False
7    False
8    False
Name: CapturableSeparation, dtype: bool
然后在上述布尔掩码上使用以识别连续非零值的块:

>>> b

2    2
3    2
6    4
7    4
8    4
Name: CapturableSeparation, dtype: int64
将这些连续块上的数据帧分组,并使用
date
CapturableSeparation
来聚合列
mean

>>> out

      persistence  avgvalue
0 0 days 00:02:00  0.040000
1 0 days 00:03:00  0.733333

到目前为止你试过什么?你哪里失败了?@Manakin我最初尝试创建一个只包含正值的行的表,然后计算观察值之间的时间差。这在上一个连续的积极因素和下一个积极因素之间造成了太多的跳跃,我一直在努力想出一个概念上合理的解决方案,而不仅仅是强行解决问题。我基本上可以按照我刚才所说的去做,并在一个小时内消除所有的时间差,但这妨碍了代码在运行行“out=df.groupby(b,as_index=False).agg(**agg_dict)”时对新数据的使用,我得到一个键错误,表示“Column'date'不存在”。这是因为我的日期列是datetimeindex吗?是的,在使用上述代码之前,您需要重置
索引。检查
df=df.reset\u index()