Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 根据条件查找两个日期之间的行数_Python_Pandas - Fatal编程技术网

Python 根据条件查找两个日期之间的行数

Python 根据条件查找两个日期之间的行数,python,pandas,Python,Pandas,我的数据如下所示: Datetime column Binary column 2020-01-02 08:30:00 True 2020-01-02 08:31:00 False 2020-01-02 08:32:00 False 2020-01-02 08:33:00 False 2020-01-02 08:34:00 True . . . 2020-01-02 08:58:00 True 如您所见,数据总是以1分钟的间隔出现。此外,还有一个二进制true/false列 我有一个可

我的数据如下所示:

Datetime column     Binary column
2020-01-02 08:30:00 True
2020-01-02 08:31:00 False
2020-01-02 08:32:00 False
2020-01-02 08:33:00 False
2020-01-02 08:34:00 True
.
.
.
2020-01-02 08:58:00 True
如您所见,数据总是以1分钟的间隔出现。此外,还有一个二进制true/false列

我有一个可变间隙,它指定了两个真实值之间可能出现的最大连续错误数。如果差距更大,我什么也不做;如果间距较小,我希望删除所有受影响的行。在我们的示例中(对于前5行),如果gap=3或更多,我不想删除任何行。如果间隙更小(1,2),我想删除第2,3,4行

我当前的解决方案通过使用
日期间()方法解决了这个问题。我用True遍历所有日期的压缩列表,并检查中间日期序列的长度是否小于或等于间隔


您是否知道有任何其他方法(最好是矢量化的)可以在不使用for循环的情况下解决此问题?

经过多次尝试和错误,我可以找到一种方法。我不确定它是否是最佳的,但它是矢量化的。代码如下:

import pandas as pd
import numpy as np

gap = 3  # You can modify this value
# Create dataframe with True/False sequences
tmp = pd.DataFrame([True, False, True, False, False, True, False, False, False, True, False, False,
                    False, False, False, True], columns=['Binary'])
# Convert to zeros and ones to make computations and filtering
tmp['col_0'] = (tmp==False).astype(int)
# Count consecutive False in a vectorized way. Check Note 1 for next line
tmp['col_1'] = ((tmp['col_0'] * (tmp['col_0'].groupby((tmp['col_0'] != tmp['col_0'].shift()).cumsum()).cumcount() + 1)) > gap).astype(int)
# Create NaN in lines we are interested to remove
tmp['col_2'] = tmp['col_1'].replace(1, np.nan)
# Finish creating NaN in lines before we reached the 'gap' value. Check Note 2 for next segment
for counter in range(1, gap + 1):
    tmp['col_2'] = tmp['col_2'] + tmp['col_1'].shift(-counter)
    tmp['col_2'] = tmp['col_2'].replace(1, np.nan)
# The shift() function creates NaN at the end of the Dataframe. I need to verify the last lines (length of dataframe - gap) are ok. Check Note 3
tmp.iloc[np.where(tmp[len(tmp) - gap:]['col_1'] == 0)[0] + len(tmp) - gap, 2] = 0
# Drop the NaN lines
tmp.dropna(inplace=True)
注1:支票

注2:我在这里问了一个矢量化的问题:“@andrej kesely”非常友好地解决了这个问题。从这里我想到了使用pd.shift()。也许这可以用一种更好的方式进行矢量化,但到目前为止,这就是我能够理解它的方式

注3:支票

如您所见,有几个步骤,但都是矢量化的


如果这是有用的,我将感谢您的支持并将其标记为解决方案

您能添加一个具有预期输出的更好的测试用例吗?