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

Pandas中使用between_time结合apply创建布尔列报错的问题咨询

解决Datetime索引DataFrame创建时段标记列的报错问题

错误原因

你用apply(lambda x: ...)的方式有误:apply会逐行遍历DataFrame,这里的x是单行数据的Series对象,而between_time是针对整个DatetimeIndex的批量筛选方法,不能直接用在单行的单个datetime索引上,这会导致返回的结果是一个无法直接用于if判断的Series,触发"The truth value of a Series is ambiguous"错误。

解决方法

下面两种方法都能实现需求,且避免报错:

方法一:直接通过索引的time属性判断区间

提取DatetimeIndex的时间部分,直接比较时间范围,再转成1/0的数值:

import pandas as pd

# 创建US_market列:每日8:30-15:00为1
df_elaborated['US_market'] = (
    (df_elaborated.index.time >= pd.to_datetime('8:30').time()) &
    (df_elaborated.index.time <= pd.to_datetime('15:00').time())
).astype(int)

# 创建EU_market列:每日2:00-8:30为1
df_elaborated['EU_market'] = (
    (df_elaborated.index.time >= pd.to_datetime('2:00').time()) &
    (df_elaborated.index.time <= pd.to_datetime('8:30').time())
).astype(int)

# 创建AS_market列:每日00:00-2:00 或 15:00-23:59:59为1
cond_as1 = df_elaborated.index.time <= pd.to_datetime('2:00').time()
cond_as2 = df_elaborated.index.time >= pd.to_datetime('15:00').time()
df_elaborated['AS_market'] = (cond_as1 | cond_as2).astype(int)

方法二:利用between_time筛选索引后赋值

先初始化列为0,再把between_time筛选出的索引位置设为1:

# 处理US_market
df_elaborated['US_market'] = 0
us_idx = df_elaborated.between_time('8:30', '15:00').index
df_elaborated.loc[us_idx, 'US_market'] = 1

# 处理EU_market
df_elaborated['EU_market'] = 0
eu_idx = df_elaborated.between_time('2:00', '8:30').index
df_elaborated.loc[eu_idx, 'EU_market'] = 1

# 处理AS_market:合并两个时段的索引
as_idx1 = df_elaborated.between_time('00:00', '2:00').index
as_idx2 = df_elaborated.between_time('15:00', '23:59:59').index
df_elaborated['AS_market'] = 0
df_elaborated.loc[as_idx1.union(as_idx2), 'AS_market'] = 1

注意:处理AS_market时,用23:59:59代替00:00,避免和第一个时段的起始时间重叠导致重复标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:10:34