根据范围将日期时间分类到新列中

Categorise the datetime in to a new column based on the range

我有一个名为 df 的数据集,如下所示:

provider fid pid datetime
CHE-223 2bfc9a62 2f43d557 2021-09-26T23:18:00
CHE-223 fff669e9 295b82e2 2021-08-13T09:10:00

我想创建一个名为 wave 的新 table,它具有 datetime 日期范围内的分类值。例如对于从2019年11月16日到2020年2月28日的日期,它给出了covid之前的值等等。

我使用了一个循环函数来实现这个,这是我使用的代码:

def wave(row):
    if (row["datetime"] <= pd.Timestamp("2019-11-16")) & (row["datetime"] >= pd.Timestamp("2020-02-28")):
        wave="before covid"
    elif (row["datetime"] <= pd.Timestamp("2020-03-01")) & (row["datetime"] >= pd.Timestamp("2020-06-15")):
        wave="1st wave"
    elif (row["datetime"] <= pd.Timestamp("2020-06-16"))  & (row["datetime"] >= pd.Timestamp("2020-09-30")):
        wave="between waves"
    elif (row["datetime"] <= pd.Timestamp("2020-10-01")) & (row["datetime"] >= pd.Timestamp("2021-01-15")):
        wave="2nd wave"

df["wave"]=df.apply(lambda row:wave(row),axis=1)

但它给了我一个名为 wave 但没有值的 。我该如何解决这个问题并对日期进行分类?

您的函数需要 return 一些东西。你的日期比较也是倒置的:

(row["datetime"] <= pd.Timestamp("2019-11-16")) & (row["datetime"] >= pd.Timestamp("2020-02-28"))

将匹配 2019 年 11 月 16 日之前和2020 年 2 月 28 日之后的日期...这当然永远不会发生。

您的函数应如下所示:

def wave(row):
    wave = ""
    if (row["datetime"] >= pd.Timestamp("2019-11-16")) and (row["datetime"] <= pd.Timestamp("2020-02-28")):
        wave="before covid"
    elif (row["datetime"] >= pd.Timestamp("2020-03-01")) and (row["datetime"] <= pd.Timestamp("2020-06-15")):
        wave="1st wave"
    elif (row["datetime"] >= pd.Timestamp("2020-06-16"))  and (row["datetime"] <= pd.Timestamp("2020-09-30")):
        wave="between waves"
    elif (row["datetime"] >= pd.Timestamp("2020-10-01")) and (row["datetime"] <= pd.Timestamp("2021-01-15")):
        wave="2nd wave"
    elif (row["datetime"] >= pd.Timestamp("2021-01-16")):
        wave="after second wave"
    return wave

编辑:& 也是一个 bit-wise 运算符。对于逻辑表达式,使用 and.