【问题标题】:convert double to time in python在python中将double转换为时间
【发布时间】:2019-04-29 00:43:43
【问题描述】:

我的 django 模型中有一个 TimeField()。我想将这个记录的总和转换为小时。

这是我认为的实际代码:

hours_week_decimal = Timesheet.objects.filter(owner = request.user.pk, week = datetime.datetime.now().isocalendar()[1]).aggregate(total=Sum('working_hour')) # this method return a dict of decimal
total_hours_week = convertDecimalToHours(hours_week_decimal)

及相关功能:

def convertDecimalToHours(times):
    total_time = 0
    for k, v in times.items():
        total_time += int(v)
    print("type: {} - value: {}".format(type(total_time), total_time))

这让我回来了:

 type: int - value: 166000

我有两个小时:

 Monday (08:30) and Tuesday(08:30)

它一定是回了我"17:00"

希望你能帮我解决这个问题:)

【问题讨论】:

  • 如果你分享dict的例子会容易得多。
  • 你用谷歌搜索过吗?和这个stackoverflow.com/a/6706329/10035556有关系吗?
  • 我不知道为什么你期望像17:00这样的输出,而你的函数输出是print("type: {} - value: {}".format(type(total_time), total_time)),所以函数convertDecimalToHours(times)不会产生你想要的。
  • @Ssein 看起来字典的值类似于 083000 和 083000,其总和为 166000,但他预计输入时间为 08:30 和 08:30,因此输出应为 170000不是 166000
  • 是的,你说的有道理,但是从他刚才问的内容来看,并没有那么清楚。

标签: python django datetime django-aggregation timefield


【解决方案1】:

问题是 30m+30m = 60m 是的,是 1h,但是你期望计算器能够理解你想要 30+30 = 1h 因此,在您的情况下,您必须将 8:30 显式转换为 8.5

用几行代码扩展您的示例的快速但不优雅的方法是:

  • 将整数转换为字符串。
  • 去掉小时(位置 0 和 1)并乘以 60 以获得分钟。
  • 将此结果与分钟相加(位置 2 和 3)

对您拥有的每个 TimeField 执行此操作后,将所有转换为分钟的时间相加,然后以小时为单位重新转换。

在你的例子中:

def convertDecimalToHours(times):
total_time = 0
for k, v in times.items():
    tmp_time = str(int(v))
    minutes = int(tmp_time[2:4]) + int(tmp_time[0:2])*60
    total_time += minutes / 60 # Now your 8:30 is 8.5
print("type: {} - value: {}".format(type(total_time), total_time))

您的输出将是 17。 我建议您将此作为示例来理解这个概念,而不是作为您问题的打包解决方案。

【讨论】:

    【解决方案2】:

    谢谢你的回答,

    在我的数据库中,我有一列类型为“时间”的列。该值的存储方式如下:08:30:00.000000。

    使用我之前的代码,时间变量(传入参数)是这样的:

    {'total': 十进制('166000.000000')}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2013-05-02
      • 2023-04-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多