Numpy select处理时间列时默认条件返回错误值问题求解
问题根因
- 这是
numpy.select的固有行为:numpy本身对pandas的datetime64[ns]类型适配性有限,执行逻辑分支选择时,会自动将datetime值转换为纳秒级int64时间戳(就是你看到的19位大数字),且最终输出的数组dtype会降级为object,不会自动还原为datetime类型。 - 额外触发因素:你的第二个返回分支因为
value1存在NaN值,本身就包含空值,numpy在合并不同分支的datetime类型时更容易出现类型强制转换问题。
解决方案
方案1:直接转换输出结果(改动最小)
原有np.select逻辑完全不用调整,执行完后加一行类型转换即可,那些大数字本身就是合法的纳秒时间戳,pandas可以直接识别:
# 原有np.select赋值逻辑不变,新增下面一行 tmp_df1['datetime3'] = pd.to_datetime(tmp_df1['datetime3'])
转换后datetime3的dtype就会变成你预期的datetime64[ns]。
方案2:改用pandas原生条件逻辑(类型更稳定)
如果不想额外做类型转换,可以用pandas原生的loc赋值,原生支持保留datetime类型:
# 先初始化默认值 tmp_df1['datetime3'] = tmp_df1['datetime2'] # 匹配第一个条件赋值 cond1 = (tmp_df1['value1'] < 0.0002) & (tmp_df1['datetime2'] < (datetime_const + pd.DateOffset(months=12))) tmp_df1.loc[cond1, 'datetime3'] = datetime_const + pd.DateOffset(months=12) # 匹配第二个条件赋值 cond2 = (tmp_df1['value1'] >= 0.0002) & ((((tmp_df1['datetime2'] - datetime_const ).dt.days/365)*tmp_df1['value1']) < 0.0002) tmp_df1.loc[cond2, 'datetime3'] = datetime_const + pd.to_timedelta(((0.0002/tmp_df1['value1'])*365).round(), unit='D')
该方案不需要后续转换,输出结果直接就是datetime类型。
内容的提问来源于stack exchange,提问作者rluo
相关产品推荐
相关产品推荐

