【问题标题】:Parse datetime with hours 1-24 instead of 0-23用 1-24 小时而不是 0-23 小时解析日期时间
【发布时间】:2013-11-06 08:40:32
【问题描述】:

我有一个数据源,其中包含我在 Python 中读取的日期时间。该程序总是在第 24 小时结束,因为 python 保存日期 0-23 而不是 1-24。

考虑到我得到一个像“2012/15/01 24”这样的字符串,处理这个问题的最佳方法是什么?

我可以使用正则表达式提取日期,将其转换为日期时间,然后再次使用正则表达式来获取小时,转换为 int,减去一个小时,然后将小时添加到日期时间,但这看起来像痛。

有没有更好的方法,或更常见的方法?

【问题讨论】:

  • 你确定这是一个小时吗?这是一个非常奇怪的系统,可以存储 1-24 小时
  • 如果是小时,你确定24 不是指下一个天的凌晨0点吗?
  • 通常情况下,零时是一天开始时的午夜,而 2400 是一天结束时的午夜。 11 月 5 日 2400 时与 11 月 6 日 000 时相同。
  • @MarkReed 如果范围是 0-24,这将是有意义的,但显然它是 1-24(因此排除一天的开始)
  • 是的,这是电力行业,所以所有内容都以小时结束而不是小时开始引用。所以 24 真的代表从 23 开始的小时。

标签: python


【解决方案1】:

不是我的,但它会完成这项工作。

try:
     time = datetime.datetime.strptime(time, " %H:%M:%S.%f")
except ValueError:
     time = time.replace(' 24', ' 23')
     time = datetime.datetime.strptime(time, " %H:%M:%S.%f")
     time += datetime.timedelta(hours=1)

【讨论】:

    【解决方案2】:

    我敢打赌,您的数据源实际上包含从 0 到 24 的小时数。检查那个。区分“一天开始时”的午夜和“一天结束时”的午夜是一个“愚蠢的想法”。如果是这样,那么正如@Amadan 所说,24 真的意味着 下一天 00:00。

    如何处理它取决于日期时间如何在数据源中表示的准确(详尽的)详细信息。一个例子不足以说明这一点。如果仅此而已,那么检查thestring.endswith(" 24") 就足以捕捉到这种情况。如果确实有这种情况,请将 24 扔掉,转换为 datetime,然后添加 timedelta(days=1)

    或者,如果您完全确定小时的范围是 1 到 24 (含),则必须从小时中减去 1。但我肯定从未见过这样工作的系统。

    【讨论】:

    • 数据源以字符串形式提供日期,采用小时结束格式,这就是为什么它是 01-24 而不是 00-23。但这有效。谢谢!
    • 好吧,如果 24 真的意味着“晚上 11 点到午夜之间的某个时间”,那么添加 timedelta(days=1) 当然是不正确的。
    • 在这种情况下,每个小时都被转换为表示一小时的结束而不是开始。所以我需要从每个小时开始 -1 小时。
    • 是的,对我来说听起来不错!不过,您不需要使用正则表达式 - thestring.rindex(' ') 将给出字符串中最后一个空白的索引,然后您可以使用简单的切片来分割小时。或者,更简单,如果您知道字符串中只有一个空格,请执行date, hour = thestring.split()
    【解决方案3】:

    我可能会选择一些简单的东西,例如:

    from datetime import datetime
    import re
    
    s = '2012/15/01 24'
    y, d, m, h = map(int, re.findall('\d+', s))
    dt = datetime(y, m, d, h - 1)
    # 2012-01-15 23:00:00
    

    【讨论】:

      猜你喜欢
      • 2014-11-02
      • 2015-03-20
      • 2017-02-22
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多