我有一个带有日期和刻度数据的数据框,如下所示:
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()
)一起使用,但它永远无法削减,也许有人会尝试。 >
答案 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.Grouper
和unique
,并且我相信学会利用pd.Grouper
是{{ 1}}:
pandas
df.groupby(pd.Grouper(key='Date', freq='15T')).Bid.unique()