Ausgabe
Seien Sie der folgende Python-Pandas-DataFrame:
| num_ID | start_date | end_date | time |
| ------ | ----------- | ---------- | ----------------- |
| 1 | 2022-02-14 | 2022-02-15 | 0 days 09:23:00 |
| 2 | 2022-02-12 | 2022-02-15 | 2 days 10:23:00 |
| 2 | 2022-02-05 | 2022-02-27 | 22 days 02:35:00 |
| 3 | 2022-02-04 | 2022-02-06 | 1 days 19:55:00 |
Und der folgende DataFrame, der aufeinanderfolgende Daten mit ihren jeweiligen Feiertagswerten in der is_holiday
Spalte enthält.
| date | is_holiday | name | other |
| ---------- | ---------- | ---- | ----- |
| 2022-01-01 | True | ABC | red |
| 2022-01-02 | False | CNA | blue |
...
# we assume in this case that the omitted rows have the value False in column
| 2022-02-15 | True | OOO | red |
| 2022-02-16 | True | POO | red |
| 2022-02-17 | False | KTY | blue |
...
| 2023-12-30 | False | TTE | white |
| 2023-12-31 | True | VVV | red |
Ich möchte total_days
dem anfänglichen DataFrame eine neue Spalte hinzufügen, die die gesamten Feiertage angibt, die im zweiten DataFrame mit True gekennzeichnet sind, die jede Zeile zwischen den beiden Daten ( start_date
und end_date
) durchläuft.
Beispiel für Ausgabeergebnis:
| num_ID | start_date | end_date | time | total_days |
| ------ | ----------- | ---------- | ----------------- | -------------- |
| 1 | 2022-02-14 | 2022-02-15 | 0 days 09:23:00 | 1 |
| 2 | 2022-02-12 | 2022-02-15 | 2 days 10:23:00 | 1 |
| 2 | 2022-02-05 | 2022-02-27 | 22 days 02:35:00 | 2 |
| 3 | 2022-02-04 | 2022-02-06 | 1 days 19:55:00 | 0 |
Lösung
Verwendung DataFrame.merge
mit Querverknüpfung nach Zeilen mit nur True
s Filtern nach Spalte holiday
, Filtern nach Series.between
und Zählen nach GroupBy.size
, zuletzt neue Spalte hinzufügen mit DataFrame.join
:
df2 = df.merge(df1.loc[df1['holiday'], ['date']], how='cross')
s = (df2[df2['date'].between(df2["start_date"],df2["end_date"])]
.groupby(['start_date','end_date']).size())
df = df.join(s.rename('total_holidays'), on=['start_date','end_date'])
df['total_holidays'] = df['total_holidays'].fillna(0, downcast='int')
print (df)
num_ID start_date end_date total_time total_holidays
0 1 2022-02-14 2022-02-15 0 days 09:23:00 1
1 2 2022-02-12 2022-02-15 2 days 10:23:00 1
2 2 2022-02-05 2022-02-27 22 days 02:35:00 2
3 3 2022-02-04 2022-02-06 1 days 19:55:00 0
Beantwortet von – jezrael
Antwort geprüft von – Mildred Charles (FixError Admin)