gpt4 book ai didi

python - 使用多个 DateTimeIndex 分解数据框的最有效方法

转载 作者:行者123 更新时间:2023-11-28 19:01:36 26 4
gpt4 key购买 nike

我有一个数据框,其中包含很长一段时间内每分钟的证券价格。

我想提取价格的子集,在特定时间段内每天 1 个。

这是一个暴力破解的例子(为简洁起见每小时使用一次):

dates  = pandas.date_range('20180101', '20180103', freq='H')
prices = pandas.DataFrame(index=dates,
data=numpy.random.rand(len(dates)),
columns=['price'])

我现在有一个 DateTimeIndex,代表我想提取的每一天的时间:

start = datetime.datetime(2018,1,1,8)
end = datetime.datetime(2018,1,1,17)
day1 = pandas.date_range(start, end, freq='H')

start = datetime.datetime(2018,1,2,9)
end = datetime.datetime(2018,1,2,13)
day2 = pandas.date_range(start, end, freq='H')

days = [ day1, day2 ]

然后我可以使用 prices.index.isin 和我的每个 DateTimeIndexes 来提取相关日期的价格:

daily_prices = [ prices[prices.index.isin(d)] for d in days]

这按预期工作:

daily_prices[0]

enter image description here

daily_prices[1]

enter image description here

问题是,随着每个选择 DateTimeIndex 的长度增加,以及我想要提取的天数增加,我的列表理解速度变慢了。

因为我知道每个选择 DateTimeIndex 都完全包含它包含的时间,所以我尝试使用 loc 以及我的列表理解中每个索引的第一个和最后一个元素:

daily_prices = [ prices.loc[d[0]:d[-1]] for d in days]

虽然快了点,但是天数很大的时候还是特别慢

是否有更有效的方法将数据帧划分为上述开始和结束时间范围?

最佳答案

如果每天的时间看起来都是一致的,您可以只过滤索引,这应该非常快:

In [5]: prices.loc[prices.index.hour.isin(range(8,18))]
Out[5]:
price
2018-01-01 08:00:00 0.638051
2018-01-01 09:00:00 0.059258
2018-01-01 10:00:00 0.869144
2018-01-01 11:00:00 0.443970
2018-01-01 12:00:00 0.725146
2018-01-01 13:00:00 0.309600
2018-01-01 14:00:00 0.520718
2018-01-01 15:00:00 0.976284
2018-01-01 16:00:00 0.973313
2018-01-01 17:00:00 0.158488
2018-01-02 08:00:00 0.053680
2018-01-02 09:00:00 0.280477
2018-01-02 10:00:00 0.802826
2018-01-02 11:00:00 0.379837
2018-01-02 12:00:00 0.247583
....

编辑:根据您的评论,直接在索引上工作,然后在最后进行一次查找可能仍然是最快的,即使它并不总是每天都一致。使用 groupby 可以轻松完成最后的单日框架。

例如:

df = prices.loc[[i for i in prices.index if (i.hour in range(8, 18) and i.day in range(1,10)) or (i.hour in range(2,4) and i.day in range(11,32))]] 
framelist = [frame for _, frame in df.groupby(df.index.date)]

将为您提供一个数据框列表,每个列表元素包含 1 天,每个月的前 10 天包括 8:00-17:00,第 11-31 天包括 2:00-3:00。

关于python - 使用多个 DateTimeIndex 分解数据框的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52012279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com