[英]Comparing 2 dataframes to add rows if between dates
這里是全新的,我嘗試查找我的問題,但找不到任何非常相似的東西!
我正在嘗試設置一個包含時間表及其活動類型數據的數據框。 例如,如果它是“1”,它是一個正常的活動,如果它是“2”,它被取消,然后將該數據幀與另一個數據幀進行比較,以查看第一個數據幀中的開始/結束日期之間是否存在日期,如果是,將其修改為 3 行而不是 1 行,第一個開始/結束日期行直到該假期,假期日期行,然后是假期后繼續的開始/結束日期。
我創建單個數據框沒有問題,但是當我想比較另一個系列/數據框並可能添加可能位於所述 StartDate 和 EndDate 之間的行時,我的問題就出現了。
示例計划數據框
開始日期 | 結束日期 | 活動類型 |
---|---|---|
2021-01-01 | 2021-12-31 | 1 |
與其他數據框相比
假期開始日期 | 假期結束日期 |
---|---|
2021-02-14 | 2021-02-14 |
2021-07-04 | 2021-07-05 |
像這樣結束:
開始日期 | 結束日期 | 活動類型 |
---|---|---|
2021-01-01 | 2021-02-13 | 1 |
2021-02-14 | 2021-02-14 | 2 |
2021-02-15 | 2021-07-03 | 1 |
2021-07-04 | 2021-07-04 | 2 |
2021-07-05 | 2021-12-31 | 1 |
任何幫助表示贊賞!
謝謝,S。
為了提供一個更具啟發性的示例,我創建了包含多行的Schedule :
Start Date End Date Activity Type
0 2021-01-01 2021-05-31 10
1 2021-06-01 2021-12-31 20
我將假期創建為:
Holiday Start Date Holiday End Date
0 2021-02-14 2021-02-14
1 2021-03-10 2021-03-12
2 2021-07-04 2021-07-06
所有日期列都是datetime64類型。
准備步驟是從Holidays創建一個IntervalIndex :
ind = pd.IntervalIndex.from_arrays(Holidays['Holiday Start Date'],
Holidays['Holiday End Date'], closed='both')
要從單行獲取結果,請創建以下函數:
def getActivities(row):
dd = pd.date_range(row['Start Date'], row['End Date'])
ss = dd.to_series().apply(lambda dat: ind.contains(dat).any())
s1 = ss[ss != ss.shift()]
s2 = ss[ss != ss.shift(-1)]
s1 = s1.astype(int) + row['Activity Type']
rv = s1.astype(int).reset_index().rename(columns={'index': 'Start Date',
0: 'Activity Type'})
rv.insert(1, 'End Date', s2.index)
return rv
要測試此函數,您可以在單行上調用它,例如,初始行:
getActivities(Schedule.iloc[0])
要完全了解所有詳細信息,請在變量下保存一行Schedule :
row = Schedule.iloc[0]
然后執行getActivities 中的每條指令並查看中間結果。
為了獲得所有行的預期結果,您必須將此函數的應用結果連接到每一行:
pd.concat(Schedule.apply(getActivities, axis=1).values, ignore_index=True)
對於我的測試數據,結果是:
Start Date End Date Activity Type
0 2021-01-01 2021-02-13 10
1 2021-02-14 2021-02-14 11
2 2021-02-15 2021-03-09 10
3 2021-03-10 2021-03-12 11
4 2021-03-13 2021-05-31 10
5 2021-06-01 2021-07-03 20
6 2021-07-04 2021-07-06 21
7 2021-07-07 2021-12-31 20
前 5 行來自Schedule 的第0行,有 2 個假期。 最后 3 行來自第1行,有 1 個假期。
請注意, Activity Type是原始值(對於“正常”期間)或原始值 + 1(對於假期期間),因此Schedule不應包含連續值作為Activity Type 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.