将timedelta转换为天,小时和分钟

Oli*_*Oli 220 python timedelta

我有时间了.我想要那些日子,小时和分钟 - 无论是作为元组还是字典......我都不会被激怒.

多年来我必须用十几种语言做了十几次这样的事情,但Python通常对一切都有一个简单的答案,所以我想在破坏一些令人作呕的简单(但冗长)数学之前我会问这里.

Fooz先生提出了一个很好的观点.

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

我是否正确地说这不会导致夏令时?如果没有,添加/减去一小时的最简单方法是什么?

Ale*_*lli 310

如果您有datetime.timedeltatd,则td.days已经为您提供了所需的"天数".timedelta值将每日分数保持为秒(不是直接小时或分钟),因此您确实必须执行"令人作呕的简单数学",例如:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60
Run Code Online (Sandbox Code Playgroud)

  • 使用“ //”代替“ /”来获取整数,而不是浮点数。`//`是一个楼层除法运算符:“除法运算得到的整数被调整到数字行的左侧”,请参见[here](https://www.programiz.com/python-programming/operators)。 (5认同)
  • 为什么//?代替 / (3认同)
  • 添加剩余的秒数怎么样?`天,小时,分钟 = x.天,x.秒 // 3600,x.秒 %3600//60` 然后`秒 = x.秒 - 小时*3600 - 分钟*60` (3认同)
  • 为什么这些不在标准库中?“天”和“秒”可用,但“小时”和“分钟”不可用?srsly?有些电池不包括在内。`</rant>` (3认同)
  • 请记住,如果 `td` 为负数,则 `-1 // 3600` 为 `-1`。 (2认同)
  • @EerikSvenPuudist 正如 `jcrs` 指出的,`-1//3600` 是 `-1`,所以为什么不使用 `int(td.seconds/3600)` 来将 `-1` 秒变成 `0` 小时而不是比“1”小时倒退? (2认同)

mbe*_*hea 69

这有点紧凑,您可以分两行获得小时,分钟和秒.

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
Run Code Online (Sandbox Code Playgroud)

  • 如果`td.days`非零,则不正确.你需要`hours + = td.days*24`.如果你想考虑一秒的分数(OP没有); 可以使用`seconds + = td.microseconds/1e6`. (7认同)

Jas*_*rff 25

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60
Run Code Online (Sandbox Code Playgroud)

至于DST,我认为最好的办法是将两个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
Run Code Online (Sandbox Code Playgroud)

  • 如果本地时区在不同时间可能有不同的 utc 偏移量(很多人都是如此),那么 `mktime()` 可能会失败——您可以使用 `pytz` 模块以可移植的确定性方式访问 tz 数据库。另外,当地时间可能不明确(50% 的错误机会)——您需要一些额外的信息来消除歧义,例如,经常(并非总是)[日志文件中的日期是单调的](http://stackoverflow.com/a /26221183/4279)。请参阅[How can I minus a day from a python date?](http://stackoverflow.com/q/441147/4279),它可能需要处理类似的问题。 (2认同)

Mat*_*OFF 7

我使用了以下内容:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")
Run Code Online (Sandbox Code Playgroud)


小智 6

我不明白

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60
Run Code Online (Sandbox Code Playgroud)

这个怎么样

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0
Run Code Online (Sandbox Code Playgroud)

你可以获得一分钟和几分钟的浮动.


Tim*_*inn 5

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

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
    }
Run Code Online (Sandbox Code Playgroud)

这是返回 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)
Run Code Online (Sandbox Code Playgroud)


SiL*_*NC3 5

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

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

示例 - 计算:

>>> import timedelta

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

# init from datetime.timedelta
>>> td = timedelta.Timedelta(datetime1 - datetime2)
Run Code Online (Sandbox Code Playgroud)

示例 - 属性:

>>> td = timedelta.Timedelta(days=2, hours=2)
>>> td.total.seconds
180000
>>> td.total.minutes
3000
>>> td.total.hours
50
>>> td.total.days
2
Run Code Online (Sandbox Code Playgroud)

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

  • 这也可以绕过 timedelta 的限制,因为它取决于 C。因此,它甚至无法处理中等大的时间。它只能处理小于 10 亿的天计数,如果您使用大于 +2G 的值,则会出现类型转换错误,因为基础类型似乎只是 32 位有符号整数。 (2认同)

Fei*_*Yao 5

虽然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)
Run Code Online (Sandbox Code Playgroud)