Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pd.read\u excel读取多页xlsx时,如何将列值转换为str?_Python_Excel_Pandas_Openpyxl - Fatal编程技术网

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)