You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中基于日期区间生成二进制列pre_season

解决方法

你的代码存在两个核心问题:

  • Lambda表达式语法错误:Python的lambda不支持多行if-elif-else的写法,三元表达式仅能处理单条件分支,多条件需调整逻辑实现方式。
  • 重复日期转换:每次调用lambda都重复将字符串转为datetime对象,会浪费大量计算资源。

下面提供两种可行的修正方案:

方案1:修正Lambda逻辑(小数据量适用)

先提前把所有日期区间转换为datetime对象,再用any()判断日期是否落在任一区间内:

import pandas as pd

# 提前定义所有赛季前区间,避免重复转换日期
pre_season_ranges = [
    (pd.to_datetime('2021-02-28'), pd.to_datetime('2021-03-30')),
    (pd.to_datetime('2017-02-22'), pd.to_datetime('2017-04-01')),
    (pd.to_datetime('2018-02-21'), pd.to_datetime('2018-03-27')),
    (pd.to_datetime('2019-02-21'), pd.to_datetime('2019-03-26')),
    (pd.to_datetime('2020-02-21'), pd.to_datetime('2020-07-22'))
]

# 用lambda结合any()实现判断逻辑
df5['pre_season'] = df5['gameDate'].apply(
    lambda x: 1 if any(start <= x <= end for start, end in pre_season_ranges) else 0
).astype(int)

方案2:向量化操作(大数据量推荐)

Pandas的向量化操作比apply效率高得多,适合处理大型数据集,可通过pd.Series.between结合逻辑或|实现:

import pandas as pd

# 先确保gameDate列是datetime类型(若尚未转换)
df5['gameDate'] = pd.to_datetime(df5['gameDate'])

# 构建所有区间的判断条件
condition = (
    df5['gameDate'].between('2021-02-28', '2021-03-30') |
    df5['gameDate'].between('2017-02-22', '2017-04-01') |
    df5['gameDate'].between('2018-02-21', '2018-03-27') |
    df5['gameDate'].between('2019-02-21', '2019-03-26') |
    df5['gameDate'].between('2020-02-21', '2020-07-22')
)

# 将布尔条件转换为二进制列
df5['pre_season'] = condition.astype(int)

补充说明

  • 若不确定gameDate列是否为datetime类型,必须先执行pd.to_datetime(df5['gameDate'])转换,否则日期比较会出现错误。
  • 方案2的向量化操作避免了逐行遍历,数据量较大时性能提升极为明显。

内容的提问来源于stack exchange,提问作者Mike Marra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:05:18