如何在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
相关产品推荐
相关产品推荐

