首页 > 解决方案 > 使用pd.read_excel读取多页xlsx时如何将列值转换为str?

问题描述

我有一个多页xlsx文件,我想处理选定的页面,最后将它们保存为CSV.

这是来自一页的一些原始数据的快照:

在此处输入图像描述

我使用此代码加载所有页面并逐个处理每个页面:

def load_raw_excel_file(file_full_name):

    df = pd.read_excel(file_full_name, sheet_name=None, engine="openpyxl", header=0)
    sheets_name = list(df.keys())

    return df, sheets_name

代码的输出(来自同一页面)如下所示:

dfs, shs =  load_raw_excel_file("myexelfile.xlsx")
dfs['myselectedsheetname']

在此处输入图像描述

如您所见,该Contract列中的某些值已更改为最新,但我不想要任何更改。我试过使用convertorsand dtypein pd.read_excel,但没有用:

df = pd.read_excel(file_full_name, sheet_name=None, engine="openpyxl", header=0, dtype=str)

或者

df = pd.read_excel("myexelfile.xlsx", sheet_name='selectedsheetname', header=0, converters={'Contract':str})

任何想法?

更新

我找到了一种解决方法,但不是一个好的解决方案:

def convert_str_date(x):
    
    try:
        y = x.strftime("%b-%y")
        return y
    except:
        return x


df.Contract.apply(lambda x : convert_str_date(x))

另外,请参阅@Simon 回答

标签: pythonexcelpandasopenpyxl

解决方案


excel将这些值设置为日期时间格式。也许您可以对数据框进行后处理,

nKCol = df['Contract']                                            
oKCol = df['Contract'].copy()

# update cell to %b-%y string format; Nan if error                            
nKCol = pd.to_datetime(nKCol, errors='coerce').dt.strftime('%b-%y')

# update the column
df['Contract'] = nKCol   
  
# fill Nan with original column                                       
df['Contract'] = df['Contract'].fillna(oKCol) 

推荐阅读