簡體   English   中英

Pandas:自上次發生以來經過的天數

[英]Pandas: Number of days elapsed since last occurrence

我看到問題是針對單個日期而不是一組不同的日期回答的:我想創建一個列來計算自 Pandas 中最后一次發生事件以來經過的天數。 我有一個包含具有以下結構的類似數據框的字典:

                Vol  Vol_lag  Fed_meeting
Date                                     
2005-06-02  72.9000  72.5000          0.0
2005-06-10  78.3000  72.9000          0.0
2005-06-16  76.0500  78.3000          0.0
2005-06-17  73.0500  76.0500          0.0
2005-06-24  75.7000  73.0500          0.0
...             ...      ...          ...
2022-01-03  80.3288  77.8832          0.0
2022-01-04  83.1597  80.3288          0.0
2022-01-05  80.5131  83.1597          0.0

這是通過遍歷我的字典中的數據框獲得的,如下所示:

df = pd.read_excel(file, sheet_name=None, index_col="Date", parse_dates=True)
fed_df = pd.read_excel(fed_file, index_col="Date", parse_dates=True)

for key in df:
    df[key]["Vol_lag"] = df[key]["Vol"].shift(1)
    df[key] = pd.merge(df[key], fed_df, how='outer', left_index=True, right_index=True)
    df[key].fillna(0, inplace=True)

“Fed_meeting”是一列,如果當天有美聯儲會議,則包含 1,如果沒有,則包含 0。 我想在每個數據框中添加一列“Days_elapsed”,用於計算自 Fed_meeting 上次等於 1 以來經過的天數(即,如果今天是美聯儲日,則等於 0,如果會議是昨天,則等於 1,等等上)。 我的數據已導入,因此 dataframe 的索引已經具有日期時間格式。

編輯添加:不幸的是,日期之間的間隔不規則(有時數據點之間有 1 周的間隔,但有時間隔是每天),因此代碼必須基於實際經過的天數,而不僅僅是數據的數量兩次會議之間的點。

編輯 2 : Fed_meeting 列已經是我原來的 dfs 和僅包含 Fed 會議日期的 fed_df 合並的產物。

非常感謝!

您可以使用asof合並來獲得最近的美聯儲會議日期(過去),然后手動計算這些日期之間的天差。 asof合並保證結果與left DataFrame 的長度相同。

起始數據

# So there are some Fed_meetings in the actual data
print(df)

                Vol  Vol_lag  Fed_meeting
Date                                     
2005-06-02  72.9000  72.5000          0.0
2005-06-10  78.3000  72.9000          0.0
2005-06-16  76.0500  78.3000          1.0
2005-06-17  73.0500  76.0500          0.0
2005-06-24  75.7000  73.0500          1.0
2022-01-03  80.3288  77.8832          0.0
2022-01-04  83.1597  80.3288          0.0
2022-01-05  80.5131  83.1597          1.0

代碼

import pandas as pd

meetings = df[df['Fed_meeting'].eq(1)].copy()
meetings['Prev_date'] = meetings.index

df = pd.merge_asof(df, meetings['Prev_date'],
                   left_index=True, right_index=True,
                   direction='backward')

df['Date_diff'] = df.index-df['Prev_date']

print(df)
                Vol  Vol_lag  Fed_meeting  Prev_date Date_diff
Date                                                          
2005-06-02  72.9000  72.5000          0.0        NaT       NaT
2005-06-10  78.3000  72.9000          0.0        NaT       NaT
2005-06-16  76.0500  78.3000          1.0 2005-06-16    0 days
2005-06-17  73.0500  76.0500          0.0 2005-06-16    1 days
2005-06-24  75.7000  73.0500          1.0 2005-06-24    0 days
2022-01-03  80.3288  77.8832          0.0 2005-06-24 6037 days
2022-01-04  83.1597  80.3288          0.0 2005-06-24 6038 days
2022-01-05  80.5131  83.1597          1.0 2022-01-05    0 days

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM