如何基于日期/星期匹配模式为时间序列添加指定布尔列?
解决方案:为时间序列添加布尔校验列
问题背景
现有一个时间序列数据集,其中观测值对应周一、周三、周六的日期,数据示例如下:
0 1 0 Saturday 03/23/2024 1 Wednesday 03/20/2024 2 Monday 03/18/2024 3 Saturday 03/16/2024 4 Wednesday 03/13/2024 .. ... ...
需要添加两列布尔值:
- 第一列:检查当前日期是否被
["Monday", "Wednesday", "Saturday"]中的不同两天前后夹着 - 第二列:检查当前日期与前一日期的时间差是否在
[2,3]区间内
实现步骤(基于Pandas)
首先确保已导入pandas库,并加载数据到DataFrame中(假设DataFrame名为df):
import pandas as pd # 加载数据(示例) data = [ ["Saturday", "03/23/2024"], ["Wednesday", "03/20/2024"], ["Monday", "03/18/2024"], ["Saturday", "03/16/2024"], ["Wednesday", "03/13/2024"] ] df = pd.DataFrame(data, columns=["weekday", "date"])
步骤1:转换日期列为datetime类型
先把字符串格式的日期转换成Pandas可识别的datetime对象,这是后续计算的基础:
df["date"] = pd.to_datetime(df["date"], format="%m/%d/%Y")
步骤2:添加第一列(前后夹着不同目标星期)
我们需要:
- 获取当前行的前一行星期(
shift(1))和后一行星期(shift(-1)) - 校验前、后星期都属于目标列表,且两者不相同
代码实现:
target_weekdays = {"Monday", "Wednesday", "Saturday"} # 计算前一行和后一行的星期是否在目标列表中 prev_in_target = df["weekday"].shift(1).isin(target_weekdays) next_in_target = df["weekday"].shift(-1).isin(target_weekdays) # 校验前后星期不同 prev_next_diff = df["weekday"].shift(1) != df["weekday"].shift(-1) # 合并条件得到第一列 df["is_sandwiched_by_diff_targets"] = prev_in_target & next_in_target & prev_next_diff
步骤3:添加第二列(时间差在[2,3]区间)
计算当前日期与前一日期的时间差(注意数据是倒序排列,所以用前一行日期减当前行日期),然后判断差值是否在2到3天之间:
# 计算日期差(单位:天) date_diff = df["date"].shift(1) - df["date"] date_diff_days = date_diff.dt.days # 判断是否在[2,3]区间 df["diff_in_2_3_days"] = date_diff_days.between(2, 3)
最终结果示例
执行上述代码后,DataFrame会新增两列布尔值,示例输出如下:
weekday date is_sandwiched_by_diff_targets diff_in_2_3_days 0 Saturday 2024-03-23 False False 1 Wednesday 2024-03-20 True True 2 Monday 2024-03-18 True True 3 Saturday 2024-03-16 True True 4 Wednesday 2024-03-13 False False
内容的提问来源于stack exchange,提问作者Rebel
相关产品推荐
相关产品推荐

