当时间序列中的下一个值较大时过滤数据

时间:2018-08-03 17:51:28

标签: python python-3.x pandas datetime

我正在尝试对数据帧进行子集化,如下所示:-

如果数据框的“ time_col”列中的条目如下:

# 00:00:00, 00:10:00,16:14:00, 22:59:00, 01:00:00, 04:14:00, 08:18:00, 18:18:00

然后我们需要创建2个数据帧,因为上面的时间表示 2天。

# data_frame_1 -> 00:00:00, 00:10:00,16:14:00, 22:59:00
# data_frame_2 -> 01:00:00, 04:14:00, 08:18:00, 18:18:00

我有一个时间序列数据和按时间顺序排列的时间,但是在时间23:59:00之后,它又从00:00:00开始,但是是第二天。

----------------------------------------------------- -------------------------------

简单来说,如果df中的一列具有如下值,且最低和最高值为0和9:-

#1,2,3,4,5,6,7,8,9,4,5,6,7,8,1,2,4,5,8

所以,我想将df过滤到以下多个数据帧中:-

#df1<- 1,2,3,4,5,6,7,8,9
#df2<- 4,5,6,7,8
#df3<- 1,2,4,5,8

我想让它变得动态。我的意思是,无论是3天还是30天,这两种情况都应该起作用。

2 个答案:

答案 0 :(得分:1)

IIUC

s=pd.Series([1,2,3,4,5,6,7,8,9,4,5,6,7,8,1,2,4,5,8])
s.groupby(s.diff().lt(0).cumsum()).apply(list)
Out[115]: 
0    [1, 2, 3, 4, 5, 6, 7, 8, 9]
1                [4, 5, 6, 7, 8]
2                [1, 2, 4, 5, 8]
dtype: object

答案 1 :(得分:0)

对于df

       times
0   00:00:00
1   00:10:00
2   16:14:00
3   22:59:00
4   01:00:00
5   04:14:00
6   08:18:00
7   18:18:00

您可以按照以下两个步骤进行操作:

df['times'] = pd.to_datetime(df.times)
df['group_label'] = df.groupby(df.times.diff().dt.days.cumsum().fillna(0)).grouper.group_info[0]
df['times'] = df.times.dt.time
list_dfs = [df.loc[df.group_label==x].drop('group_label',1) for x in df.group_label.unique()]

输出:

 [0    00:00:00
 1    00:10:00
 2    16:14:00
 3    22:59:00
 Name: times, dtype: object, 
 4    01:00:00
 5    04:14:00
 6    08:18:00
 7    18:18:00
 Name: times, dtype: object]

您可以通过

访问该列表

list_dfs[0]

    times
0   00:00:00
1   00:10:00
2   16:14:00
3   22:59:00

list_dfs[1]

    times
4   01:00:00
5   04:14:00
6   08:18:00
7   18:18:00