簡體   English   中英

如果在日期之間比較 2 個數據框以添加行

[英]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.

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