[英]pandas slice multiple windows simultaneously from time series index
我有一個腳本,該腳本會生成包含日期“塊”的數據幀,並將其存儲在諸如“ cur_blocks”這樣的變量中:
year start end date
gmt_reportedtime
2019-03-11 2000 2000-01-09 2000-03-10 2019-03-11
2019-03-11 2001 2001-01-09 2001-03-10 2019-03-11
2019-03-11 2002 2002-01-09 2002-03-10 2019-03-11
2019-03-11 2003 2003-01-09 2003-03-10 2019-03-11
2019-03-11 2004 2004-01-09 2004-03-10 2019-03-11
我還有另一個在日期時間索引的數據幀“ col”,其中包含我想進行下游計算(例如排名和z分數)的數據。 我想使用“ cur_blocks”的“ start”和“ end”中表示的塊對col的多個塊進行切片。 “ cur_blocks”中的日期塊是60天的時段,每個時段在2000-2019年之間間隔1年。
這是“ col”:
X
2000-01-01 24
2000-01-02 90
2000-01-03 62
2000-01-04 10
...
2019-02-28 73
2019-03-01 96
[7000 rows x 1 columns]
到目前為止,我已經這樣解決了:
window_aggregate = pd.DataFrame()
for index, block in cur_blocks.iterrows():
dt_block = col.loc[block['start']:block['end']]
window_aggregate = pd.concat([window_aggregate, dt_block])
然后,我可以使用“ window_aggregate”進行下游工作。 這行得通,但是它非常慢,因為會為2000年1月1日至今天之間的每個日期生成“ cur_blocks”。
我很驚訝熊貓沒有內置函數來執行此類操作? 除非我錯過了? 但是另一個堆棧溢出的用戶也提出了類似的問題,到目前為止, 這里還沒有回答
我最近在這里發布了一個問題,詳細介紹了更廣泛的問題,盡管我編寫的代碼主要解決了該問題,但對於實際目的而言,它太慢了。
我已經看到它在這里解決了幾年的一天,但是沒有窗戶。
這里可能有解決方案,但我不知道如何將答案應用於我的數據
編輯:顯示所需的輸出,如下所示,數據框中的日期與cur_blocks中的開始和結束塊相對應期望的輸出
X 2000-01-09 24 2000-01-10 90 ... 2000-03-10 62 2001-01-09 10 2001-01-10 10 ... 2001-03-10 10 2002-01-09 10 ... ... ... 2004-03-10 73
我會在一年中合並兩個數據框。 然后,您可以簡單地使用行的過濾條件來過濾結果數據框,其中col
的日期在start
和end
日期之間。 在合並所需的各種索引操作和最終的列選擇之后,它給出:
pd.DataFrame(pd.concat([col, pd.Series(col.index.year,
index=col.index, name='year')],axis=1)
.rename_axis('dat').reset_index().merge(cur_blocks, on='year')
.query('(start <= dat) & (dat <= end)').set_index('dat')
.rename_axis('')['X'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.