根据范围将日期时间分类到新列中
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
.
我有一个名为 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
.