AttributeError: 'pywintypes.datetime' object has no attribute 'nanosecond'

AttributeError: 'pywintypes.datetime' object has no attribute 'nanosecond'

我有一些代码可以打开 excel 文件并将其保存为 pandas 数据框,它最初用于 Python 2.7,我目前正在努力使其工作在 Python 3.

最初,我使用了另一个 post 中@myidealab 中的代码:From password-protected Excel file to pandas DataFrame。 目前看起来像这样:

data_file = <path_for_file>
# Load excel file
xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.Visible = False
pswd = getpass.getpass('password: ')
xldatabase = xlApp.Workbooks.Open(data_file, False, True, None, pswd)

dfdatabase = [] 
for sh in xldatabase.Sheets:
    xlsheet = xldatabase.Worksheets(sh.Name)

    # Get last_row
    row_num = 0
    cell_val = ''
    while cell_val != None:
        row_num += 1
        cell_val = xlsheet.Cells(row_num, 1).Value
    last_row = row_num - 1

    # Get last_column
    col_num = 0
    cell_val = '' 
    while cell_val != None:
        col_num += 1
        cell_val = xlsheet.Cells(1, col_num).Value
    last_col = col_num - 1

# Get content
content = xlsheet.Range(xlsheet.Cells(1, 1), xlsheet.Cells(last_row, last_col)).Value

# Load each sheet as a dataframe
dfdatabase.append(pd.DataFrame(list(content[1:]), columns=content[0]))

现在,我收到以下错误:

AttributeError: 'pywintypes.datetime' object has no attribute 'nanosecond'

问题似乎归结为以下几行:

# Get content
content = xlsheet.Range(xlsheet.Cells(1, 1), xlsheet.Cells(last_row, last_col)).Value

# Load each sheet as a dataframe
dfdatabase.append(pd.DataFrame(list(content[1:]), columns=content[0]))

xlsheet.Range().Value 正在读取数据并将 pywintymes 描述符分配给数据,pd.DataFrame() 无法解释。

以前有人 运行 解决过这个问题吗?有没有一种方法可以明确告诉 xlsheet.Range().Value 如何以 pandas 可以解释的方式读取值?

欢迎任何帮助! 谢谢。

假设您事先知道 excel sheet 中 dates/times 的 size/formatting,这就解决了这个问题。 尽管如此,可能还有其他更优雅的方法来解决它。

注意:内容最初是一个元组。位置 [0] 是包含 headers 的数组,其余位置包含数据。

import datetime
import pywintypes

...

content = xlsheet.Range(xlsheet.Cells(1, 1), xlsheet.Cells(last_row, last_col)).Value
head = content[0]
data = list(content[1:])

for x in range(0,len(data)):
    data[x] = list(data[x])
    for y in range(0,len(data[x])):
        if isinstance(data[x][y], pywintypes.TimeType):
            temp = str(data[x][y]).rstrip("+00:00").strip()
            if len(temp)>10:
                data[x][y] = datetime.datetime.strptime(temp, "%Y-%m-%d%H:%M")
            elif len(temp)>5 and len(temp)<=10:
                data[x][y] = datetime.datetime.strptime(temp, "%Y-%m-%d")
            elif len(temp)<=5:
                data[x][y] = datetime.datetime.strptime(temp, "%H:%M")
            print(data[x][y])

# Load each sheet as a dataframe
dfdatabase.append(pd.DataFrame(data, columns=head))

以此为参考: python-convert-pywintyptes-datetime-to-datetime-datetime