如何强制Pandas列查询返回字符串及避免Excel列名被解析为日期
解决Pandas解析Excel列名为日期及强制列返回字符串的问题
一、阻止列名"Jun-17"被解析为datetime类型
Pandas默认会尝试识别表头中的日期格式,导致"Jun-17"被转成datetime对象。你有两种简洁的解决方式:
方式1:读取后直接将列名转为字符串
这是最直接的办法,读取数据后把所有列名强制转换成字符串类型:
import pandas as pd df = pd.read_excel('Sample.xlsx', sheet_name='Sheet1') # 将列名转为字符串 df.columns = df.columns.astype(str) print("Column headings:") print(df.columns.tolist())
输出的列名将变成['Column One', 'Column Two', '2018-06-17 00:00:00', 'Column Three']——如果想保留原始的"Jun-17"格式,推荐用下面的方式。
方式2:读取时避免解析表头为日期
这种方法先把表头当作普通数据行读取,再手动设置列名并转换为字符串,能完美保留原始列名格式:
import pandas as pd # 先读取所有内容,不设置表头 temp_df = pd.read_excel('Sample.xlsx', sheet_name='Sheet1', header=None) # 提取第一行作为列名,强制转为字符串 df_columns = temp_df.iloc[0].astype(str) # 从第二行开始加载实际数据,并设置列名 df = temp_df[1:].rename(columns=dict(zip(temp_df.columns, df_columns))) # 重置索引(可选,让索引从0开始) df = df.reset_index(drop=True) print("Column headings:") print(df.columns.tolist())
这样输出的列名就会是['Column One', 'Column Two', 'Jun-17', 'Column Three'],完全符合预期。
二、强制列查询返回字符串类型,禁止自动解析内容
要让Pandas不自动解析列内容,而是强制返回字符串,有几种常用方法:
方法1:读取时全局指定所有列类型为字符串
通过dtype=str参数,让Pandas读取所有列时都以字符串类型加载:
import pandas as pd # 读取时强制所有列为字符串类型 df = pd.read_excel('Sample.xlsx', sheet_name='Sheet1', dtype=str) # 此时查询任意列,返回的都是字符串类型 print(type(df['Jun-17'].iloc[0])) # 输出 <class 'str'>
方法2:指定特定列转为字符串
如果只需要部分列保持字符串类型,用converters参数精准控制:
import pandas as pd # 仅指定"Jun-17"和"Column One"列为字符串类型 df = pd.read_excel('Sample.xlsx', sheet_name='Sheet1', converters={ 'Jun-17': str, 'Column One': str })
方法3:读取后转换列类型
如果已经读取了数据,也可以事后将目标列转为字符串:
import pandas as pd df = pd.read_excel('Sample.xlsx', sheet_name='Sheet1') # 转换指定列为字符串 df['Jun-17'] = df['Jun-17'].astype(str) # 验证类型 print(type(df['Jun-17'].iloc[0]))
内容的提问来源于stack exchange,提问作者Biggie Al
相关产品推荐
相关产品推荐

