将时间增量转换为天、小时和分钟

2025-02-25 09:07:00
admin
原创
20
摘要:问题描述:我有一个 timedelta。我想要从中得到天数、小时数和分钟数 - 无论是作为元组还是字典...我并不担心。这些年来,我肯定已经用十几种语言做过十几次这样的事情了,但是 Python 通常对所有问题都有一个简单的答案,所以在提出一些令人作呕的简单(但冗长)的数学问题之前,我想在这里问一下。Fooz...

问题描述:

我有一个 timedelta。我想要从中得到天数、小时数和分钟数 - 无论是作为元组还是字典...我并不担心。

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

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

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

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


解决方案 1:

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

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

解决方案 2:

这更紧凑一些,您可以在两行中看到小时、分钟和秒。

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

解决方案 3:

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

至于夏令时,我认为最好的办法是将两个datetime单位都转换为秒。这样系统就可以为您计算夏令时。

>>> 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

解决方案 4:

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

上述帖子与 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

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

解决方案 5:

我不明白

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

您可以获得一分钟的分钟和秒数作为浮点数。

解决方案 6:

我使用了以下内容:

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

解决方案 7:

下面是我编写的一个小函数,可以精确到微秒地完成此操作:

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
    }

以下是返回的版本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)

解决方案 8:

虽然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)

解决方案 9:

而如果你使用 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

解决方案 10:

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

解决方案 11:

这是另一种可能的方法,虽然比前面提到的方法更冗长一些。对于这种情况,这可能不是最好的方法,但它可以方便地以未存储在对象中的特定单位(周、小时、分钟、毫秒)获取时间长度,而无需记住或计算转换因子。

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

我有一个 timedelta。我想要从中得到天数、小时数和分钟数 - 无论是作为元组还是字典...我并不担心。

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

解决方案 12:

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

解决方案 13:

如果使用pandas (至少版本 >1.0),该类Timedelta有一个components属性,它返回一个命名元组,其中所有字段都布局得很好。

例如

import pandas as pd
delta = pd.Timestamp("today") - pd.Timestamp("2022-03-01")
print(delta.components)

解决方案 14:

timedeltas 有一个daysseconds属性..您可以轻松地自行转换它们。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用