我有一个time。我想要其中的日,小时和分钟-作为元组或字典…我并不大惊小怪。

这些年来,我肯定用十几种语言做过十几次,但Python通常对所有问题都有一个简单的答案,所以我想在抛出一些令人作呕的简单(但冗长)数学之前,在这里问一下。

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

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

我说的对吗,这不包括夏令时?如果不是,最简单的增加/减少一个小时的方法是什么?


当前回答

如果你有约会时间。时间增量值td td。Days已经给了你想要的“Days”。Timedelta值以秒(而不是直接的小时或分钟)作为一天的分数,所以你确实需要执行“令人作呕的简单数学”,例如:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

其他回答

timedelta = pd.Timestamp("today") - pd.Timestamp("2022-01-01")
print(timedelta.components)
print(timedelta.components.days)
print(timedelta.components.seconds)

将返回如下内容:

Components(days=281, hours=2, minutes=24, seconds=3, milliseconds=72, microseconds=493, nanoseconds=0) 
281
3

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

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

我有一个time。我想要其中的日,小时和分钟-作为元组或字典…我并不大惊小怪。

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

如果你使用的是python datetime包,你也可以像下面这样编码:

import datetime
tap_in = datetime.datetime.strptime("04:12", "%H:%M")
tap_out = datetime.datetime.strptime("18:20", "%H:%M")
num_of_hour = (tap_out - tap_in).total_seconds()/3600
num_of_hour # 14.133333333333333

我使用了以下方法:

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

timedelta有一个天和秒属性。您可以自己轻松地转换它们。