pandas仅提取非空datetime字段时间戳报NaTType不支持timestamp错误如何解决
错误原因
- numpy的
np.where函数的执行逻辑是先完整计算两个分支的所有表达式结果,再根据条件选择对应位置的返回值,不会因为你写了df1['Date'].isnull()的判断就跳过空值行的第二个分支计算 - 你的第二个分支
pd.to_datetime(df1['Date'])会把原本为空的日期值转换为NaT(pandas中时间类型的空值表示),后续调用timestamp()方法时,NaT不支持该方法,直接触发报错。
解决方案
方案1:使用pandas内置dt属性实现(最简洁)
pandas的时间序列dt访问器自带timestamp()方法,空值(NaT)处理后会自动返回NaN,直接调用fillna填充你要的空格即可,无需写条件判断和lambda:
pd.to_datetime(df1['Date']).dt.timestamp().fillna(' ')
方案2:修改lambda增加非空判断
如果需要保留你原来的逻辑结构,可在lambda中先判断值是否为时间空值再调用方法:
np.where( df1['Date'].isnull(), ' ', pd.to_datetime(df1['Date']).apply(lambda a: a.timestamp() if pd.notna(a) else ' ') )
方案3:仅对非空行做处理后赋值
如果你想完全避免处理空值行,可以先筛选非空行计算时间戳,再给空值行填充空格:
# 初始化结果列为空格 df1['result'] = ' ' # 仅给非空日期行赋值时间戳 not_null_mask = df1['Date'].notnull() df1.loc[not_null_mask, 'result'] = pd.to_datetime(df1.loc[not_null_mask, 'Date']).apply(lambda a: a.timestamp())
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

