【问题标题】:Why doesn't python datetime give negative seconds and hours when subtracting two dates?为什么 python datetime 在减去两个日期时不给出负的秒数和小时数?
【发布时间】:2021-05-27 13:19:43
【问题描述】:

我想知道为什么我没有从 datetime.timedelta 中得到负小时和负秒?

我有以下方法

def time_diff(external_datetime, internal_datetime):

    from pandas.core.indexes.period import parse_time_string # include for completeness 

    time_external = parse_time_string(external_datetime)[0]
    time_internal = parse_time_string(internal_datetime)[0]

    diff = time_external - time_internal
    return diff

当日期时间看起来像这样时,一切都符合预期;

external_datetime = "2020-01-01T00:00:00"
internal_datetime = "2020-01-02T00:00:00"

返回的是 -1 天的 datetime.timedelta (datetime.timedelta(days=-1))

为什么当我把时间改为;

external_datetime = "2020-01-01T00:00:00"
internal_datetime = "2020-01-01T01:30:00"

我会得到datetime.timedelta(days=-1, seconds=81000) 的差异

我确实想知道这是不是因为“接近”午夜,但是

external_datetime = "2020-01-01T11:00:00"
internal_datetime = "2020-01-01T11:30:00"

结果为@​​987654329@

版本

  • python 3.8.2
  • 熊猫 1.1.4

【问题讨论】:

  • 为什么?因为 timedelta 类的__str__ 方法是这样编码的?您仍然可以为 timedelta 编写自己的“strftime”,请参阅 Format timedelta to string 以获得灵感。
  • 顺便说一句。据我所知,这里与熊猫有什么关系,您的问题是特定于 Python 的 datetime.timedelta 的(尽管这与熊猫的 timedelta 没有什么不同)。
  • @MrFuppes 我包括了熊猫,因为它是包含parse_time_string 的熊猫,我不确定它是否会产生(小)差异。为添加另一个标签欢呼。
  • 别担心,附带说明:您拥有的格式是不错的 ISO 8601,因此您可以使用 datetime.fromisoformat 方便地解析。

标签: python pandas datetime timedelta


【解决方案1】:

来自documentation for timedelta

内部仅存储天、秒和微秒。论据 转换为这些单位:

  • 毫秒转换为 1000 微秒。
  • 一分钟转换为 60 秒。
  • 一小时转换为 3600 秒。
  • 一周转换为 7 天。

然后对天、秒和微秒进行归一化,以便 表示是唯一的,具有

  • 0 <= microseconds < 1000000
  • 0 <= seconds < 3600*24(一天的秒数)
  • -999999999 <= days <= 999999999

因此,秒数和微秒数保证为非负数,天数根据需要为正数或负数。让较大的单位days 为正或负是有意义的,因为这将占任意间隔的大部分。 days 可能比必要的负数稍微多一些,使用更小、有限的单位来弥补差异。

请注意,在这种表示中,间隔的符号仅由天的符号决定。

【讨论】:

  • 有一个陷阱,正值限制为秒。以一种顺序减去两个datetime 对象将返回A - B ⇒ timedelta(seconds=…),但顺序相反B - A ⇒ timedelta(days=-1, seconds=…)。如果您随后将这些增量应用于接近 DST 更改的日期,您会得到令人惊讶的结果(因为夏令时开始或结束的日子没有 24 小时)。阅读:blog.ganssle.io/articles/2018/02/…
【解决方案2】:

计算中的时间通常基于经过参考时间的秒数(或某些秒单位)。我假设 Python 的 DateTime 将数据表示为一天开始后的小时、分钟、秒和秒的子单位。因此,seconds 永远不会是负数。因为它总是在几秒之后,所以将 -1 天 + 84600 秒设为正数是有意义的。

【讨论】:

    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    相关资源
    最近更新 更多