簡體   English   中英

如何使用 python 根據給定日期獲取最新日期?

[英]How to get most recent date based on a given date using python?

考慮以下兩個數據框:

Dataframe1 包含用戶列表和 stop_dates

在此處輸入圖像描述

Dataframe2 包含用戶交易和日期的歷史記錄

在此處輸入圖像描述

我想獲取 Dataframe1 中所有用戶的停止日期之前的最后交易日期(Dataframe1 中的某些用戶有多個停止日期)

我希望 output 如下所示:

在此處輸入圖像描述

這是完成的一種方法(確保兩個日期列都已經是日期時間):

df = pd.merge(df1, df2, on="UserID")

df["Last_Before_Stop"] = df["Stop_Date"].apply(
    lambda x: max(df["Transaction_Date"][df["Transaction_Date"] < x]) if
    len(df["Transaction_Date"][df["Transaction_Date"] < x]) != 0 else
    pd.nan
)

請始終以易於用作樣本的形式提供數據(即作為文本,而不是作為圖像 - 參見此處)。

你可以試試:

df1["Stop_Date"] = pd.to_datetime(df1["Stop_Date"], format="%m/%d/%y")
df2["Transaction_Date"] = pd.to_datetime(df2["Transaction_Date"], format="%m/%d/%y")
df = (
    df1.merge(df2, on="UserID", how="left")
    .loc[lambda df: df["Stop_Date"] >= df["Transaction_Date"]]
    .groupby(["UserID", "Stop_Date"])["Transaction_Date"].max()
    .to_frame().reset_index().drop(columns="Stop_Date")
)
  • 使datetime脫離日期列。
  • 沿UserID合並df1上的df2
  • 刪除Transaction_Date大於Stop_Date的行。
  • UserIDStop_Date,並獲取最大Transaction_Date
  • 使結果成形。

結果為

df1

   UserID Stop_Date
0       1    2/2/22
1       2    6/9/22
2       3   7/25/22
3       3   9/14/22

df2

   UserID Transaction_Date
0       1           1/2/22
1       1           2/1/22
2       1           2/3/22
3       2          1/24/22
4       2          3/22/22
5       3          6/25/22
6       3          7/20/22
7       3          9/13/22
8       3          9/14/22
9       4           2/2/22

   UserID Transaction_Date
0       1       2022-02-01
1       2       2022-03-22
2       3       2022-07-20
3       3       2022-09-14

如果您不想將dtype永久更改為datetime ,並且還希望結果為字符串,格式與輸入類似(帶填充),那么您可以嘗試:

df = (
    df1
    .assign(Stop_Date=pd.to_datetime(df1["Stop_Date"], format="%m/%d/%y"))
    .merge(
        df2.assign(Transaction_Date=pd.to_datetime(df2["Transaction_Date"], format="%m/%d/%y")),
        on="UserID", how="left"
    )
    .loc[lambda df: df["Stop_Date"] >= df["Transaction_Date"]]
    .groupby(["UserID", "Stop_Date"])["Transaction_Date"].max()
    .to_frame().reset_index().drop(columns="Stop_Date")
    .assign(Transaction_Date=lambda df: df["Transaction_Date"].dt.strftime("%m/%d/%y"))
)

結果:

   UserID Transaction_Date
0       1         02/01/22
1       2         03/22/22
2       3         07/20/22
3       3         09/14/22

暫無
暫無

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

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