Pandas中循环修改DataFrame日期时间列无效,如何永久修改格式?
解决Pandas DataFrame日期时间列格式永久修改的问题
嘿,我懂你碰到的麻烦了——直接用for循环遍历df["Datetime"]的时候,你修改的只是每个元素的副本,完全不会影响原DataFrame里的数据。这是Pandas的特性决定的,咱们换几种更靠谱的方法来实现你的需求:
方法1:用apply函数自定义处理逻辑
apply可以对列里的每个元素应用你的自定义函数,而且能直接修改原列(或者生成新列)。把你的处理逻辑打包成一个函数,传给apply就行:
import re import datetime import pandas as pd # 定义处理单个日期字符串的函数 def format_datetime(s): # 去掉开头的星期字符串 s_clean = re.sub("^[^ ]* ","", s) # 转换格式:dd.mm.yyyy HH:mm → yyyy-mm-dd HH:mm return datetime.datetime.strptime(s_clean, "%d.%m.%Y %H:%M").strftime("%Y-%m-%d %H:%M") # 直接修改原Datetime列 df["Datetime"] = df["Datetime"].apply(format_datetime)
方法2:用Pandas矢量化操作(更高效)
如果你的数据量很大,矢量化操作比apply更快,尽量用Pandas内置的字符串和日期处理函数:
import pandas as pd # 第一步:去掉开头的星期字符串(用str.replace的正则匹配) df["Datetime"] = df["Datetime"].str.replace("^[^ ]* ", "", regex=True) # 第二步:转换为datetime类型,再输出成指定格式 df["Datetime"] = pd.to_datetime(df["Datetime"], format="%d.%m.%Y %H:%M").dt.strftime("%Y-%m-%d %H:%M")
为什么原来的for循环没用?
简单说,当你写for i in df["Datetime"]时,每次循环的i都是从列里取出的字符串副本——你修改i的值,只是改变了这个临时变量,原DataFrame里的对应单元格根本没被更新。Pandas的列元素不是可直接原地修改的引用,所以必须通过赋值的方式把修改后的结果写回列里。
修改完之后,你可以用print(df["Datetime"].head())验证一下,日期格式应该已经变成你想要的yyyy-mm-dd HH:mm啦!
内容的提问来源于stack exchange,提问作者KMFR
相关产品推荐
相关产品推荐

