熊猫:在熊猫数据框中查找连续索引的起始值

时间:2019-03-20 23:43:36

标签: python pandas datetime dataframe

我有一个如下所示的数据框( main_df ):

           value               created_at
0   18.930542  2019-03-04 02:43:08 UTC
1   18.895210  2019-03-04 02:44:09 UTC
2    0.000000  2019-03-04 02:45:09 UTC
3    0.000000  2019-03-04 02:46:10 UTC
4    0.000000  2019-03-04 02:47:11 UTC
5    0.000000  2019-03-04 02:48:12 UTC
6    0.000000  2019-03-04 02:49:13 UTC
7   18.857025  2019-03-04 02:50:14 UTC
8   18.857025  2019-03-04 02:51:14 UTC
9   18.847290  2019-03-04 02:52:15 UTC
10  18.847290  2019-03-04 02:53:17 UTC
11   0.000000  2019-03-04 02:54:17 UTC
12   0.000000  2019-03-04 02:55:19 UTC
13   0.000000  2019-03-04 02:56:19 UTC
14  18.837677  2019-03-04 02:57:20 UTC

我想在“值”列中找到重复的零值段。我知道如何通过执行以下操作来找到零:

zeros_df=main_df.loc[main_df['value'] == 0]

这会给我以下数据帧( aux_df1 ): aux_df1

现在,我想知道的(但我不知道如何)是将每个连续索引系列的开始和开始都保留在名为 aux_df2 的新数据框中,并且计算每个连续值序列的开始和结束之间的时间差(以分钟为单位)。我打算做最后一部分(尽管我想成对计算每个起始端对之间的差异):

aux_df2['t_diff'] = ['temp_index'].diff().astype('timedelta64[m]')

但是第一部分我不知道该怎么做。我正在寻找的是使 aux_df2 看起来像这样:

aux_df2

有人可以帮我吗?提前致谢。

编辑:回复@peer,这就是我生成数据框的方式。请注意,上面的快照并不反映从UTC到EST的时区变化。

import pandas as pd

filepath=r'C:\Users\myfile.csv'
main_df=pd.read_csv(filepath)
main_df['created_at']=main_df['created_at'].apply(pd.to_datetime)
main_df['created_at'] = main_df['created_at'].dt.tz_localize('UTC').dt.tz_convert('EST')

3 个答案:

答案 0 :(得分:2)

您期望的t_diff似乎不正确,但这是使用np.ptp的解决方案,该解决方案将maximum - minimum置于一定范围内,并pandas.Series.cumsum

我使用cumsum是因为这样我们可以找到0的行

df['cumsum'] = df.value.cumsum()

df['t_diff'] = df.groupby('cumsum').created_at.transform(np.ptp)
df.drop('cumsum', axis=1, inplace=True)

print(df)
    Index      value          created_at   t_diff
0       0  18.930542 2019-03-04 02:43:08 00:00:00
1       1  18.895210 2019-03-04 02:44:09 00:05:04
2       2   0.000000 2019-03-04 02:45:09 00:05:04
3       3   0.000000 2019-03-04 02:46:10 00:05:04
4       4   0.000000 2019-03-04 02:47:11 00:05:04
5       5   0.000000 2019-03-04 02:48:12 00:05:04
6       6   0.000000 2019-03-04 02:49:13 00:05:04
7       7  18.857025 2019-03-04 02:50:14 00:00:00
8       8  18.857025 2019-03-04 02:51:14 00:00:00
9       9  18.847290 2019-03-04 02:52:15 00:00:00
10     10  18.847290 2019-03-04 02:53:17 00:03:02
11     11   0.000000 2019-03-04 02:54:17 00:03:02
12     12   0.000000 2019-03-04 02:55:19 00:03:02
13     13   0.000000 2019-03-04 02:56:19 00:03:02
14     14  18.837677 2019-03-04 02:57:20 00:00:00

注释,在这种情况下,我进行了变换,以获取组中每一行旁边的差异。

答案 1 :(得分:1)

根据您包含的信息,我做了这样的事情:

import pandas as pd
import numpy as np
df = pd.DataFrame({"index":[2,3,4,5,6,11,12,13],"value": [0,0,0,0,0,0,0,0]})
df["prev_index"] = df["index"].shift(1)
df["next_index"] = df["index"].shift(-1)

df["include"] = df.apply(lambda row: True if np.isnan(row.next_index) or np.isnan(row.prev_index)
         else (True if abs(row["index"]-row.next_index) != 1 
               or abs(row["index"] - row.prev_index) != 1 else False),axis=1)
df[df["include"]][["index","value"]]

我从您提供的示例中创建了一个简单的数据框,所以我的想法是根据两个列移动数据集以获得上一个和下一个索引,我只是创建了一个布尔值以了解索引是否为一个我在找。 希望对您有帮助!

答案 2 :(得分:0)

这里的游戏有点晚了,但是我想提供我的解决方案,以使用值的过滤和值的差异来找到起点和终点:

aux_df2 = main_df[
(main_df['value'] == 0) &
(
    (main_df['value'].diff() != 0)
    | main_df['value'].diff().shift(-1) != 0
)]

这给出了:

      value              created_at
2     0.0 2019-03-04 02:45:09+00:00
6     0.0 2019-03-04 02:49:13+00:00
11    0.0 2019-03-04 02:54:17+00:00
13    0.0 2019-03-04 02:56:19+00:00

不过,我想不出一种优雅的方法来获取t_diff。