TypeError: 无法将datetime.timedelta与float比较

4 投票
2 回答
12033 浏览
提问于 2025-04-20 08:26

我正在写一个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

2 个回答

1

要从一个 timedelta 对象中获取分钟数,你可以使用 total_seconds() 方法,然后把结果除以 60:

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

另外,值得注意的是,Python 有个很酷的功能叫做 比较链(比如 a <= b <= c),可以让你更方便地进行比较。

12

确实,你不能把一个 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"

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

撰写回答