【问题标题】:TypeError: unsupported operand type(s) for -: 'str' and 'datetime.datetime'TypeError: 不支持的操作数类型 -: 'str' 和 'datetime.datetime'
【发布时间】:2014-08-31 15:44:16
【问题描述】:

我正在编写我的 python 脚本以从 sqlite 数据库。

我正在创建变量 startDelta 以从 变量名为program_startDate

当我使用此语句执行代码时,我的代码出现问题:

#get the programs list
cur.execute('SELECT channel, title, start_date, stop_date FROM programs 
WHERE channel=?', [channel])
programList = list()
programs = cur

for row in programs:
     program = row[1].encode('ascii'), str(row[2]), str(row[3])
     program_startDate = str(row[2])
     program_endDate = str(row[3])
     programList.append(program)
cur.close()

idx = str(programList)

# find nearest half hour
viewStartDate = datetime.datetime.now()
viewStartDate -= datetime.timedelta(minutes = viewStartDate.minute % 30, 
seconds = viewStartDate.second)

startDelta = program_startDate - viewStartDate
stopDelta = program_endDate - viewStartDate

我会得到一个错误: TypeError: 不支持的操作数类型 -: 'str' 和 'datetime.datetime'

错误在这一行跳转:

startDelta = program_startDate - viewStartDate
stopDelta = program_endDate - viewStartDate

如何解决这个问题?

【问题讨论】:

  • 你强制 row[2] 成为一个字符串......所以你推送了错误。如果要计算,请转换为日期时间对象
  • @ngulam 是的,我确实做到了。我已将字符串存储在数据库中,例如:20140831170500。您能告诉我如何将它们转换为日期时间对象吗?

标签: python


【解决方案1】:

问题与错误状态完全相同。 program_startDateprogram_endDate 是字符串,你试图从它们中减去一个日期时间,这是 python 无法做到的。

这些值是否以日期时间的形式存储在您的数据库中?

如果是这样,请使用:

 program_startDate = row[2]
 program_endDate = row[3]

而不是将它们转换为字符串。数据库引擎将为您获取它们作为日期时间,错误将得到解决。

如果它们作为字符串存储在您的数据库中,use datetime.strptime 根据它们存储的格式将它们转换为日期时间。

编辑:

OP 在数据库中存储的日期只要是 20140831170500。要解决这个问题,请使用:

from datetime import datetime
...
...
for row in programs:
    program = row[1].encode('ascii'), str(row[2]), str(row[3])
    program_startDate = datetime.strptime(str(row[2]), '%Y%m%d%H%M%S')
    program_endDate = datetime.strptime(str(row[3]), '%Y%m%d%H%M%S')
    programList.append(program)

【讨论】:

  • 不,不是。您正在将它们转换为字符串,Korem 不是。
  • @Korem:是的,我已将日期时间存储在我的数据库中。当我尝试您建议我使用的代码时,我收到了错误:TypeError: unsupported operand type(s) for -: 'long' and 'datetime.datetime'。错误在同一条线上跳跃。知道如何解决吗?
  • 这个是不是像你上面说的那样存储,只要20140831170500?如果是这样,你可以试试datetime.strptime(str(row[2]), '%Y%m%d%H%M%S')
  • 你的意思是我应该试试program_startDate = datetime.strptime(str(row[2]), '%Y%m%d%H%M%S')?如果是这样我得到错误:AttributeError:'module'对象没有属性'strptime'。有什么想法吗?
  • @user3848630 我编辑了我的答案以解决您的问题
【解决方案2】:

根据您从数据库表中检索到的数据类型...如果您有一个“长”(如上面对评论的回答中所述):

转换为日期时间对象: program_startdate = datetime.strptime(str(row[2]), "%Y%m%d%H%M%S")

【讨论】:

  • 非常感谢,但我收到错误:AttributeError: 'module' object has no attribute 'strptime'。有什么想法吗?
  • 这说明你没有正确导入,点赞:from datetime import datetime
  • 抱歉,我忘记在我的代码顶部导入from datetime import datetime。我可以看到它已经解决了这个问题,但是当我使用这个program_startdate = datetime.strptime(row[2], "%Y%m%d%H%M%S") 时,我会收到一个错误:TypeError: strptime() argument 1 must be string, not long。知道如何解决这个问题吗?
  • so:将字符串转换为row[2],就像您之前所做的那样:program_startdate = datetime.strptime(str(row[2]), "%Y%m%d%H%M%S")
猜你喜欢
  • 2016-01-16
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2013-02-20
  • 2018-12-06
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多