322

我有一个时间增量。我想要其中的天数、小时数和分钟数——无论是作为元组还是字典......我并不大惊小怪。

这些年来,我一定用十几种语言做了十几次,但是 Python 通常对所有事情都有一个简单的答案,所以我想我会先在这里问一下,然后再解决一些令人作呕的简单(但冗长)的数学问题。

福兹先生提出了一个很好的观点。

我正在处理“列表”(有点像 ebay 列表),其中每个列表都有一个持续时间。我试图通过做找到剩下的时间when_added + duration - now

我是否正确地说这不会考虑 DST?如果不是,加/减一个小时的最简单方法是什么?

4

11 回答 11

449

如果你有一个datetime.timedeltatdtd.days已经给了你想要的“天数”。timedelta值将一天中的小数部分保持为秒(而不是直接小时或分钟),因此您确实必须执行“令人作呕的简单数学”,例如:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60
于 2010-01-22T18:26:00.890 回答
90

这有点紧凑,你可以在两行中获得小时、分钟和秒。

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6
于 2012-06-11T14:16:53.177 回答
35
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

至于夏令时,我认为最好的办法是将两个datetime对象都转换为秒。这样,系统会为您计算 DST。

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0
于 2010-01-22T18:25:45.833 回答
9

我不明白

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

这个怎么样

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

你得到一分钟的分钟和秒作为浮点数。

于 2011-10-20T17:19:05.230 回答
8

对于所有来寻找实现的人:

上面的帖子与 datetime.timedelta 有关,遗憾的是它没有小时和秒的属性。到目前为止,还没有提到有一个包含这些的包。你可以在这里找到它:

示例 - 计算:

>>> import timedelta

>>> td = timedelta.Timedelta(days=2, hours=2)

# init from datetime.timedelta
>>> td = timedelta.Timedelta(datetime1 - datetime2)

示例 - 属性:

>>> td = timedelta.Timedelta(days=2, hours=2)
>>> td.total.seconds
180000
>>> td.total.minutes
3000
>>> td.total.hours
50
>>> td.total.days
2

我希望这可以帮助某人...

于 2021-03-03T14:15:36.630 回答
3

我使用了以下内容:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")
于 2020-02-01T11:18:10.757 回答
3

这是我整理的一个小函数,可以精确到微秒:

def tdToDict(td:datetime.timedelta) -> dict:
    def __t(t, n):
        if t < n: return (t, 0)
        v = t//n
        return (t -  (v * n), v)
    (s, h) = __t(td.seconds, 3600)
    (s, m) = __t(s, 60)    
    (micS, milS) = __t(td.microseconds, 1000)

    return {
         'days': td.days
        ,'hours': h
        ,'minutes': m
        ,'seconds': s
        ,'milliseconds': milS
        ,'microseconds': micS
    }

这是一个返回 a 的版本tuple

# usage: (_d, _h, _m, _s, _mils, _mics) = tdTuple(td)
def tdTuple(td:datetime.timedelta) -> tuple:
    def _t(t, n):
        if t < n: return (t, 0)
        v = t//n
        return (t -  (v * n), v)
    (s, h) = _t(td.seconds, 3600)
    (s, m) = _t(s, 60)    
    (mics, mils) = _t(td.microseconds, 1000)
    return (td.days, h, m, s, mics, mils)
于 2020-12-04T23:16:25.027 回答
2

我发现最简单的方法是使用str(timedelta). 它将返回格式为 的字符串3 days, 21:06:40.001000,您可以使用简单的字符串操作或正则表达式解析小时和分钟。

于 2020-07-23T02:22:03.183 回答
0

这是另一种可能的方法,尽管比已经提到的方法要冗长一些。对于这种情况,这可能不是最好的方法,但能够以未存储在对象中的特定单位(周、小时、分钟、毫秒)获取您的持续时间很方便,而无需记住或计算转换系数。

from datetime import timedelta
one_hour = timedelta(hours=1)
one_minute = timedelta(minutes=1)
print(one_hour/one_minute)  # Yields 60.0

我有一个时间增量。我想要其中的天数、小时数和分钟数——无论是作为元组还是字典......我并不大惊小怪。

in_time_delta = timedelta(days=2, hours=18, minutes=30)
td_d = timedelta(days=1)
td_h = timedelta(hours=1)
td_m = timedelta(minutes=1)
dmh_list = [in_time_delta.days,
            (in_time_delta%td_d)//td_h,
            (in_time_delta%td_h)//td_m]

[2, 18, 30]应该分配给哪个dmh_list

于 2021-10-05T01:34:03.830 回答
0

虽然pandas.Timedelta没有直接提供这些属性,但它确实提供了一个名为 的方法total_seconds,基于该方法可以轻松推导出天、小时和分钟:

import pandas as pd
td = pd.Timedelta("2 days 12:30:00")
minutes = td.total_seconds()/60
hours = minutes/60
days = hours/ 24
print(minutes, hours, days)
于 2021-10-27T16:03:20.240 回答
-5

timedeltas 有一个daysandseconds属性..你可以自己轻松地转换它们。

于 2010-01-22T18:24:25.010 回答