我有一個看起來像這樣的資料框:
df = pd.DataFrame([1,'A','X','1/3/22 12:00:00AM','1/1/22 12:00:00 AM','1/2/22 12:00:00 AM'],
[1,'A','X','1/4/22 12:00:00AM','1/3/22 12:00:00 AM','1/3/22 12:00:00 AM'],
[1,'A','Y','1/3/22 12:00:00AM','1/2/22 12:00:00 AM','1/1/22 12:00:00 AM'],
[1,'B','X','1/3/22 12:00:00AM','1/2/22 12:00:00 AM','1/3/22 12:00:00 AM'],
[2,'A','X','1/5/22 12:00:00AM','1/3/22 12:00:00 AM','1/4/22 12:00:00 AM'],
[2,'A','X','1/6/22 12:00:00AM','1/4/22 12:00:00 AM','1/5/22 12:00:00 AM']],
columns = ['ID','Category','Site','Task Completed','Access Completed', 'Upload Completed'])
| ID | 類別 | 地點 | 任務完成 | 訪問完成 | 上傳完成 |
|---|---|---|---|---|---|
| 1 | 一個 | X | 22 年 1 月 3 日上午 12:00:00 | 22 年 1 月 1 日凌晨 12:00:00 | 1/2/22 上午 12:00:00 |
| 1 | 一個 | X | 1/4/22 上午 12:00:00 | 22 年 1 月 3 日凌晨 12:00:00 | 22 年 1 月 3 日凌晨 12:00:00 |
| 1 | 一個 | 是 | 22 年 1 月 3 日上午 12:00:00 | 1/2/22 上午 12:00:00 | 22 年 1 月 1 日凌晨 12:00:00 |
| 1 | 乙 | X | 22 年 1 月 3 日上午 12:00:00 | 1/2/22 上午 12:00:00 | 22 年 1 月 3 日凌晨 12:00:00 |
| 2 | 一個 | X | 22 年 1 月 5 日凌晨 12:00:00 | 22 年 1 月 3 日凌晨 12:00:00 | 22 年 1 月 4 日凌晨 12:00:00 |
| 2 | 一個 | X | 1/6/22 上午 12:00:00 | 22 年 1 月 4 日凌晨 12:00:00 | 22 年 1 月 5 日凌晨 12:00:00 |
我想找到的是最大訪問完成日期或分鐘之間的時間差(以小時為單位)上傳完成日期與第一個任務完成日期之間的時間差(以小時為單位)。
在純文本中,邏輯是((最大訪問完成日期與最小上傳完成日期的較晚日期))-(最小/第一個任務完成日期)。
基于此資料集,我的預期結果如下所示:
| ID | 類別 | 地點 | 時間差異 | 第一個任務完成 | 最長訪問日期 | 最小上傳日期 |
|---|---|---|---|---|---|---|
| 1 | 一個 | X | 0 | 22 年 1 月 3 日上午 12:00:00 | 22 年 1 月 3 日凌晨 12:00:00 | 1/2/22 上午 12:00:00 |
| 1 | 一個 | 是 | 24 | 22 年 1 月 3 日上午 12:00:00 | 1/2/22 上午 12:00:00 | 22 年 1 月 1 日凌晨 12:00:00 |
| 1 | 乙 | X | 0 | 22 年 1 月 3 日上午 12:00:00 | 1/2/22 上午 12:00:00 | 22 年 1 月 3 日凌晨 12:00:00 |
| 2 | 一個 | X | 24 | 22 年 1 月 5 日凌晨 12:00:00 | 22 年 1 月 4 日凌晨 12:00:00 | 22 年 1 月 4 日凌晨 12:00:00 |
我知道如何獲得最大訪問日期減去第一個任務完成日期:
out = (df
.groupby(['ID', 'Category', 'Site'], as_index=False)
.agg({'Task Completed': 'first', 'Access Completed': 'max'})
.assign(**{'Time Difference': lambda d: d['Task Completed']
.sub(d['Access Completed'])
.dt.total_seconds().floordiv(3600)})
)
哪個有輸出:
ID Category Site Task Completed Access Completed Time Difference
0 1 A X 2022-01-03 00:00:00 2022-01-02 24.0
1 1 A Y 2022-01-01 01:00:00 2022-01-01 1.0
2 1 B X 2022-01-01 01:00:00 2022-01-01 1.0
3 2 A X 2022-01-03 00:00:00 2022-01-02 24.0
但我不知道如何合并最小上傳完成日期。
uj5u.com熱心網友回復:
嘗試:
df["Task Completed"] = pd.to_datetime(
df["Task Completed"], format="%m/%d/%y %H:%M:%S%p"
)
df["Access Completed"] = pd.to_datetime(
df["Access Completed"], format="%m/%d/%y %H:%M:%S %p"
)
df["Upload Completed"] = pd.to_datetime(
df["Upload Completed"], format="%m/%d/%y %H:%M:%S %p"
)
out = df.groupby(["ID", "Category", "Site"], as_index=False).agg(
{
"Task Completed": "first",
"Access Completed": "max",
"Upload Completed": "min",
}
)
out["Time Difference"] = np.where(
(out["Access Completed"] - out["Upload Completed"]) > pd.Timedelta(0),
(out["Access Completed"] - out["Task Completed"]).abs().dt.total_seconds()
/ 3600,
(out["Upload Completed"] - out["Task Completed"]).abs().dt.total_seconds()
/ 3600,
)
print(out)
印刷:
| ID | 類別 | 地點 | 任務完成 | 訪問完成 | 上傳完成 | 時間差異 | |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 一個 | X | 2022-01-03 12:00:00 | 2022-01-03 12:00:00 | 2022-01-02 12:00:00 | 0 |
| 1 | 1 | 一個 | 是 | 2022-01-03 12:00:00 | 2022-01-02 12:00:00 | 2022-01-01 12:00:00 | 24 |
| 2 | 1 | 乙 | X | 2022-01-03 12:00:00 | 2022-01-02 12:00:00 | 2022-01-03 12:00:00 | 0 |
| 3 | 2 | 一個 | X | 2022-01-05 12:00:00 | 2022-01-04 12:00:00 | 2022-01-04 12:00:00 | 24 |
uj5u.com熱心網友回復:
@Andrej Kesely 的回答已經涵蓋了大部分。但是,如果您想在沒有 的情況下執行此操作,則可以將操作部分numpy修改為numpy
max_time = out[["Access Completed", "Upload Completed"]].max(axis=1)
out["Time Difference"] = (out["Task Completed"] - max_time).dt.total_seconds() / 3600
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/519754.html
