Windows和Linux上的Python差异:datetime.datetime对象没有属性total_seconds

2024-06-02 05:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Linux中开发的python脚本在Linux中运行良好。它使用openpyxl迭代Excel文件中的单元格,将值与列表进行比较,并计算添加不同timedelta对象所花费的总时间(以秒为单位)。到目前为止还不错

但是这个脚本在我工作时使用的Windows笔记本电脑上不起作用。安装的是Python 3.8.5。我得到的错误是:

File "Worktypes", line 54, in <module>
    ndcluren += int(f.total_seconds())
AttributeError: 'datetime.datetime' object has no attribute 'total_seconds

脚本中的原始代码是:

for j in range(6):
    facturen = 0
    decluren = 0
    ndcluren = 0
    resturen = 0
    
    for i in range(5,30):
        e = sheet2.cell(row = i, column = 1).value
        f = sheet2.cell(row = i, column = j+5).value
        if f:
            if e in fact:
                facturen += int(f.total_seconds())
            elif e in decl:
                decluren += int(f.total_seconds())
            elif e in ndcl:
                ndcluren += int(f.total_seconds())
            else:
                resturen += int(f.total_seconds())
    
    sheet4.cell(row = 2, column = j+3).value = facturen / 3600
    sheet4.cell(row = 3, column = j+3).value = decluren / 3600
    sheet4.cell(row = 4, column = j+3).value = ndcluren / 3600
    sheet4.cell(row = 5, column = j+3).value = resturen / 3600

有点令人惊讶的是,对于“facturen”和“decluren”,脚本可以处理总的_seconds(),但是对于ndcluren则失败了。这使我认为错误在excel电子表格中。但我找不到任何奇怪或特别的东西。更改单元格格式也不起作用

我已经在这上面花了好几个小时了。谷歌的迹象表明,该脚本使用python2而不是python3。但在强制使用python3之后,我在Windows上也出现了这个错误

已解决

结果有两个问题在起作用

  1. 第一期 Excel将持续时间注册为日期。单元格显示30:30(30小时30分钟),但在Excel的公式编辑字段中显示为“1-1-1900 06:30:00”This question给出了这个问题的答案
  2. 第二期 有些单元格被识别为datetime.time对象,有些单元格被识别为datetime.datetime对象。对于datetime.time对象,上述解决方案不起作用。我通过向time对象添加一个日期来解决这个问题,并将日期和时间合并到一个datetime对象中。新脚本按预期工作:
for j in range(6):
    facturen = 0
    decluren = 0
    ndcluren = 0
    resturen = 0
    
    for i in range(5,30):
        naam = sheet2.cell(row = i, column = 1).value
        cell = sheet2.cell(row = i, column = j+5)
        if cell.value:
            if isinstance(cell.value, datetime.time):
                date = datetime.datetime.strptime('1899-12-31', '%Y-%m-%d').date()
                s = datetime.datetime.combine(date, cell.value)
                s = s-datetime.datetime(1899,12,31)
            else:
                s = cell.value-datetime.datetime(1899,12,31)
            if naam in fact:
                facturen += int(s.total_seconds())
            elif naam in decl:
                decluren += int(s.total_seconds())
            elif naam in ndcl:
                ndcluren += int(s.total_seconds())
            else:
                resturen += int(s.total_seconds())
    
    sheet4.cell(row = 2, column = j+3).value = facturen / 3600
    sheet4.cell(row = 3, column = j+3).value = decluren / 3600
    sheet4.cell(row = 4, column = j+3).value = ndcluren / 3600
    sheet4.cell(row = 5, column = j+3).value = resturen / 3600

仍然不明白为什么Windows需要额外的代码行,而Linux上的python却不需要。但至少我的问题解决了


Tags: 对象in脚本datetimevaluecellcolumnint