Python 使用pd.read\u excel读取多页xlsx时,如何将列值转换为str?
我有一个多页Python 使用pd.read\u excel读取多页xlsx时,如何将列值转换为str?,python,excel,pandas,openpyxl,Python,Excel,Pandas,Openpyxl,我有一个多页xlsx文件,我想处理所选页面,并最终将其保存为CSV 这是一页中几个RAW的快照: 我使用此代码加载所有页面并逐个处理: 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()) retur
xlsx
文件,我想处理所选页面,并最终将其保存为CSV
这是一页中几个RAW的快照:
我使用此代码加载所有页面并逐个处理:
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
列中的一些值到目前为止已经更改,但我不希望有任何更改。
我曾尝试在pd.read\u excel
中使用转换器
和dtype
,但无效:
df = pd.read_excel(file_full_name, sheet_name=None, engine="openpyxl", header=0, dtype=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 answer尝试将
dtype='str'
更改为dtype={'Contract':str}
以强制合同
为str
(str周围没有引号):
df=pd.read\u excel(文件全名,工作表名=None,engine=“openpyxl”,页眉=0,
数据类型={'Contract':str})
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)
同样的问题。我认为问题在于,当您在excel工作表中选择这些单元格时,它们是背景中的日期。如
Mar-21
显示15-03-2021
。但是我不知道如何处理它,因为SPOT
显示SPOT
。是的,似乎没有其他办法。我用类似的方法解决了这个问题:def convert\u str\u date(x):try:y=x.strftime(“%b-%y”)返回y,但返回x df.Contract.apply(lambda x:convert\u str\u date(x))
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)