1

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

    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 的过程中丢失了过滤值的 [Dates] (datetime),而且我必须手动输入每个日期和时间间隔,这是不切实际的。

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)进行操作,创建一个新的 DataFrame,其中包含集合中唯一值的 Date 和 Bid 列间隔。像这样

    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()),但它永远无法削减它,也许更擅长它的人可以尝试。

4

1 回答 1

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 分钟,并将这个新列用于drop_duplicates每 15 分钟窗口,但仍保持日期的精度。

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.Grouperand unique,我相信学习利用pd.Grouper是一个强大的工具pandas

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

Date
2016-06-01 00:00:00    [150]
2016-06-01 00:15:00    [200]
Freq: 15T, Name: Bid, dtype: object
于 2018-09-17T21:23:08.763 回答