如何将原生datetime对象存入pd.DataFrame并解决成员校验返回False问题
问题核心原因
in操作符作用于Pandas Series时,默认检查的是索引中是否存在对应值,而非检查Series的元素值。你的示例索引为0、1、2,自然不可能匹配到日期值,所以即使值存在也会返回False。- Pandas底层对时间类型的存储有统一设计:只要列被识别为时间格式,无论你存入的是原生
datetime对象还是其他时间类型,都会被自动转换为Pandas内置的Timestamp类型存储,因此你手动转to_pydatetime()后存入DataFrame也会被自动转回Timestamp。
解决方案
方案1:常规场景(推荐)
不需要强制存储原生datetime类型,Timestamp和原生datetime支持直接判等,用以下方法判断值是否存在即可:
print(df["b"].eq(datetime(2002, 2, 2)).any()) # 输出为 True
该方案保留了Pandas时间序列的内置处理能力,性能和易用性都最优。
方案2:强制存储原生datetime(特殊需求使用)
如果确实需要在DataFrame中存储原生datetime类型,可将列的dtype强制指定为object:
df["b"] = df["a"].apply(lambda t: datetime.strptime(t, '%Y-%m-%d')).astype(object) # 检查值是否存在时需要先转为列表,规避in检查索引的问题 print(datetime(2002, 2, 2) in df["b"].tolist()) # 输出为 True
注意:该方案会丢失Pandas时间序列的所有内置处理能力,非必要不建议使用。
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

