如何在Python Pandas中将Excel导入的特殊格式日期列转为datetime类型?
解决方法
这个问题我之前也碰到过,核心就是Pandas读取Excel时没拿到单元格里存储的完整日期时间值,只读到了Excel显示用的短格式文本。不用改Excel,试试下面这几个方法:
1. 先调调pd.read_excel的参数
试试用openpyxl引擎(它对新版xlsx格式支持更好),同时指定要解析的日期列,让Pandas直接读原始值:
import pandas as pd # 替换成你的文件路径,EventTS是你的日期列名 df = pd.read_excel('你的文件路径.xlsx', engine='openpyxl', parse_dates=['EventTS'])
这个方法大概率能直接解决,因为它会跳过Excel的显示格式,读取单元格里实际存储的完整日期时间。
2. 用openpyxl直接读单元格原始值
如果上面的方法不管用,那就绕开Pandas的自动解析,直接用openpyxl库读取每个单元格的真实值:
from openpyxl import load_workbook import pandas as pd # 加载你的Excel文件 wb = load_workbook('你的文件路径.xlsx') ws = wb.active # 假设数据在第一个工作表里 # 读取EventTS列的数据(假设列在第2列,第1行是表头,从第2行开始是数据) event_ts_list = [] for row in ws.iter_rows(min_row=2, min_col=2, max_col=2, values_only=True): event_ts_list.append(row[0]) # 转成DataFrame再转成datetime类型 df = pd.DataFrame({'EventTS': event_ts_list}) df['EventTS'] = pd.to_datetime(df['EventTS'])
这种方式相当于直接从Excel里把日期时间对象拿出来,完全不受显示格式影响。
3. 从数值转成日期时间(如果列存的是Excel日期数值)
要是你的Excel日期是以浮点数形式存的(Excel里日期本质是从1899-12-30开始算的天数),可以先读成数值再转换:
import pandas as pd # 先把列读成浮点数类型 df = pd.read_excel('你的文件路径.xlsx', dtype={'EventTS': float}) # 把浮点数转成datetime格式 df['EventTS'] = pd.to_datetime(df['EventTS'], unit='d', origin='1899-12-30')
4. 手动补全日期(实在没办法的最后一招)
如果上面的方法都不行,而且你知道所有记录对应的日期(比如你例子里的2019-05-02),那就把短格式的时分秒补成完整日期时间:
import pandas as pd # 假设所有记录的日期都是2019-05-02,你的短格式是'MM:SS.0' df['EventTS'] = pd.to_datetime('2019-05-02 ' + df['EventTS'].str.replace('.0', ''), format='%Y-%m-%d %M:%S') # 如果你的短格式是'HH:MM.0',就把format改成'%Y-%m-%d %H:%M'
注意哈,这个方法只适合所有记录日期固定的情况,要根据你实际的字符串格式调整format参数。
内容的提问来源于stack exchange,提问作者Maths12
相关产品推荐
相关产品推荐

