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

