我有一个如下所示的数据框( 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_df2 的新数据框中,并且计算每个连续值序列的开始和结束之间的时间差(以分钟为单位)。我打算做最后一部分(尽管我想成对计算每个起始端对之间的差异):
aux_df2['t_diff'] = ['temp_index'].diff().astype('timedelta64[m]')
但是第一部分我不知道该怎么做。我正在寻找的是使 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')
答案 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。