在设定的时间间隔内过滤出列的唯一值

时间:2018-09-17 21:14:17

标签: python pandas

我有一个带有日期和刻度数据的数据框,如下所示:

    Date                    Bid
0   20160601 00:00:00.020   160.225
1   20160601 00:00:00.136   160.226
2   20160601 00:00:00.192   160.225
3   20160601 00:00:00.327   160.230
4   20160601 00:00:01.606   160.231
5   20160601 00:00:01.613   160.230

我想按设置的时间间隔过滤“出价”列中的唯一值

例如:2016-06-01 00:00:00-00:15:00,2016-06-01 00:15:00-00:30:00 ...

结果将是一个新的数据帧(将过滤后的值及其日期时间保持不变)。 这是我到目前为止的代码:

#Convert Date column to index with seconds as base
df['Date'] = pd.DatetimeIndex(df['Date'])
df['Date'] = df['Date'].astype('datetime64[s]')
df.set_index('Date', inplace=True)

#Create new DataFrame with filtered values
ts = pd.DataFrame(df.loc['2016-06-01'].between_time('00:00', '00:30')['Bid'].unique())

使用上述方法,在创建新的DataFrame的过程中,我松散了过滤后的值的[日期](日期时间),而且我不得不手动输入每个日期和时间间隔,这是不现实的。

Output:
    0
0   160.225
1   160.226
2   160.230
3   160.231
4   160.232
5   160.228
6   160.227

理想情况下,我正在寻找一种可以将时间间隔设置为timedelta的操作,并且可以一次对整个文件(大约8Gb)进行操作,以创建具有唯一值的Date和Bid列的新DataFrame在设定的时间间隔内。像这样

    Date                    Bid
0   20160601 00:00:00.020   160.225
1   20160601 00:00:00.136   160.226
2   20160601 00:00:00.327   160.230
3   20160601 00:00:01.606   160.231
...
805 20160601 00:15:00.606   159.127

PS。我还尝试将pd.rolling()pd.resample()方法与apply(lambda x: function(例如pd['Bid'].unique())一起使用,但它永远无法削减,也许有人会尝试。 >

1 个答案:

答案 0 :(得分:1)

请澄清一下:这不是滚动计算。您提到了尝试使用rolling解决此问题的方法,但是从您的澄清出发,您似乎希望将时间序列拆分为离散的,不重叠的15分钟序列。

设置

df = pd.DataFrame({
    'Date': [
        '2016-06-01 00:00:00.020', '2016-06-01 00:00:00.136',
        '2016-06-01 00:15:00.636', '2016-06-01 00:15:02.836',
    ],
    'Bid': [150, 150, 200, 200]
})

print(df)

                      Date  Bid
0  2016-06-01 00:00:00.020  150
1  2016-06-01 00:00:00.136  150         # Should be dropped
2  2016-06-01 00:15:00.636  200
3  2016-06-01 00:15:02.836  200         # Should be dropped

首先,确认您的Date列为datetime

df.Date = pd.to_datetime(df.Date)

现在使用dt.floor将每个值四舍五入到最接近的15分钟,并在每15分钟窗口中使用此新列将drop_duplicates舍入,但仍保持日期的精确度。

df.assign(flag=df.Date.dt.floor('15T')).drop_duplicates(['flag', 'Bid']).drop('flag', 1)

                     Date  Bid
0 2016-06-01 00:00:00.020  150
2 2016-06-01 00:15:00.636  200

根据我的原始答案,但我仍然相信它具有价值。如果您想访问每个组的唯一值,可以使用pd.Grouperunique,并且我相信学会利用pd.Grouper是{{ 1}}:

pandas

df.groupby(pd.Grouper(key='Date', freq='15T')).Bid.unique()