pandas使用iloc/loc转换datetime列后dtype仍为object问题问询
pandas使用iloc切片赋值不修改列dtype是否为预期行为?
这是pandas中iloc、loc索引赋值的设计预期行为,两类索引的赋值逻辑存在本质差异:
- iloc是位置级别的元素赋值:当使用
df.iloc[:,0:2] = 右侧对象语法时,pandas会优先保持原有列的dtype不变,仅将右侧返回的datetime元素逐个填充到原有object类型的列中。此时列中存储的是独立的Timestamp对象,所以打印时会显示为时间格式,但整列的dtype仍然为object。 - 列名索引是列级别的整体替换:当使用
df[['start_date', 'end_date']] = 右侧对象语法时,pandas会直接将右侧生成的datetime64类型的新列整体替换原有的object列,因此列的dtype会同步更新为预期的datetime64[ns]。
你提到升级到pandas 1.3.4之前可以通过iloc完成类型转换,是因为1.3.0之前的版本中iloc的赋值逻辑存在不一致性,部分场景下会隐式修改列的dtype。1.3.0之后pandas官方对iloc的赋值行为做了标准化修正,明确了iloc赋值不会主动变更原有列的dtype,避免隐式类型转换带来的非预期数据污染。
如果需要通过位置选择列同时完成类型转换,推荐结合列名索引完成赋值,写法如下:
df[df.columns[0:2]] = df.iloc[:,0:2].apply(pd.to_datetime)
这样既可以通过位置灵活选择列,也能保证列的dtype正确更新。
内容的提问来源于stack exchange,提问作者rhug123
相关产品推荐
相关产品推荐

