Pandas循环中批量转换多DataFrame日期列为datetime失效问题
问题原因解释
核心根源:Python的变量重赋值机制未作用到原DataFrame
你写的循环代码不生效的原因和Pandas本身的日期转换逻辑无关,本质是Python的变量赋值规则导致的:
- 当你构建
cols_to_change = [df1['date1'], df2['date2'], df3['date3']]时,列表中存储的是三个Series对象的临时引用 - 循环中的
i = pd.to_datetime(i, format = '%Y-%m-%d')只是把循环变量i的指向修改为了新生成的datetime类型Series,这个操作完全没有修改原DataFrame中对应列的存储内容,相当于你只是生成了新的Series对象但没有赋值回原DataFrame,原来的df1['date1']等列依然指向原来的字符串类型Series,自然不会生效。
单独赋值生效的原因
你单独写df1['date1'] = pd.to_datetime(df1['date1'], format = '%Y-%m-%d')时,是直接对DataFrame的指定列进行赋值操作,新生成的datetime类型Series会直接覆盖原列的内容,因此转换会生效。
单独取单个值转换返回Timestamp属于正常现象,因为pd.to_datetime对单个符合格式的字符串本身就会返回Timestamp类型,这个操作没有涉及到修改原DataFrame的逻辑,自然不会有问题。
正确的批量转换写法
如果要批量修改不同DataFrame的日期列,需要存储每个列对应的DataFrame对象和列名,循环中直接对原DataFrame的列赋值即可:
cols_to_change = [ (df1, 'date1'), (df2, 'date2'), (df3, 'date3') ] for df, col_name in cols_to_change: df[col_name] = pd.to_datetime(df[col_name], format = '%Y-%m-%d')
内容的提问来源于stack exchange,提问作者user12628549
相关产品推荐
相关产品推荐

