【问题标题】:TypeError: can't compare datetime.timedelta to floatTypeError:无法将 datetime.timedelta 与浮点数进行比较
【发布时间】:2014-09-07 20:50:23
【问题描述】:

我正在编写我的 python 脚本来计算开始日期和结束日期格式之间的持续时间,例如 2014052016000020140520170000,这样我就可以得到时间。

这段代码有问题:

if epgDuration >= 0.10 and epgDuration <= 0.30:
   epgwidth = "250"

当我尝试比较 0.10 分钟和 0.30 分钟之间的时间范围时出现错误。

我得到的错误是:TypeError: can't compare datetime.timedelta to float。

错误在这一行跳转:

if epgDuration >= 0.10 and epgDuration <= 0.30:

结果如下:

14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 2:30:00
14:44:55 T:1580  NOTICE: 3:00:00
14:44:55 T:1580  NOTICE: 1:00:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 1:00:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 0:30:00
14:44:55 T:1580  NOTICE: 0:30:00

这是我用来持续时间的代码:

for row in programs:
    program_startdate = str(row[2])
    program_endDate = str(row[3])

    try:
       start_date = datetime.datetime.strptime(program_startdate, "%Y%m%d%H%M%S")
       end_date = datetime.datetime.strptime(program_endDate, "%Y%m%d%H%M%S")
    except TypeError:
       start_date = datetime.datetime.fromtimestamp(time.mktime(time.strptime(program_startdate, "%Y%m%d%H%M%S")))
       end_date = datetime.datetime.fromtimestamp(time.mktime(time.strptime(program_endDate, "%Y%m%d%H%M%S")))

    #workout the duration times to get the program time
    epgDuration = end_date - start_date

    if epgDuration >= 0.10 and epgDuration <= 0.30:
       epgwidth = "250"

    elif epgDuration >= 1.00 and epgDuration <= 1.29:
         epgwidth = "500"
    print epgwidth

【问题讨论】:

  • 这里的 0.10 分钟和 0.30 分钟究竟是什么意思?我认为您的意思是 10 分钟和 30 分钟,而不是 6 和 18 秒。
  • @MartijnPieters 是的,你是对的。你能帮我如何在 if 语句之外使用print epgwidth 吗??
  • 我更新了我的答案,以反映我认为您正在努力实现的目标。如果您使用此类详细信息更新您的问题,它会有所帮助。

标签: python datetime timedelta


【解决方案1】:

确实,您无法将 timedelta 与浮点值进行比较。

可以将对象转换为秒:

if 600 <= epgDuration.total_seconds() <= 1800:

其中 10 分钟是 600 秒,30 分钟是 1800。

或创建新的timedelta() 对象进行比较:

epgwidth = "0"

if timedelta(minutes=10) <= epgDuration <= timedelta(minutes=30):
    epgwidth = "250"

elif timedelta(hours=1) <= epgDuration <= timedelta(hours=1.5):
    epgwidth = "500"

对于时差不在 10-30 分钟或 1-1.5 小时范围内的情况,我在 if 语句之前给了 epgwidth 一个默认值。

【讨论】:

  • 非常感谢,我在 if 语句之外遇到了 print epgwidth 的问题。我收到一个错误UnboundLocalError: local variable 'epgwidth' referenced before assignment。我想在 if 语句之外获取变量以打印 epgwidth。
  • @user3757279:那么两个范围都不匹配;在这种情况下,您需要为 epgwidth 返回一个默认值。
  • 我不明白你的意思?我想在 if 语句之外打印 epgwidth,那么我该如何解决呢?
  • 您的epgDuration 值既不符合范围;例如,它可能是 0.5 分钟长。在这种情况下没有设置epgwidth。在ifstatements 之前添加更多案例或指定默认值。
  • 我想检查epgDuration 值是否在1.00 和1.30 之间,然后设置epgwidth 值。你能帮我解决我得到允许我在 if 语句之外打印 epgwidth 的错误吗?
【解决方案2】:

要从 timedetla 对象获取分钟数,您可以使用 total_seconds() 并除以 60:

epgDurationMin = epgDuration.total_seconds()/60.
if 0.10 <= epgDurationMin <= 0.30:
   ...

另外注意你可以使用 python 很酷的comparison-chaining(例如a &lt;= b &lt;= c

【讨论】:

  • 我已经尝试过了,但它不起作用。那里的答案不好!
猜你喜欢
  • 2019-03-27
  • 2013-11-19
  • 1970-01-01
  • 2021-05-28
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多