【问题标题】:How to convert a string to a DatetimeWithNanoseconds format with python?如何使用 python 将字符串转换为 DatetimeWithNanoseconds 格式?
【发布时间】:2021-11-03 19:36:00
【问题描述】:

我有多个字符串表示时间戳。一些示例可能是:19551231 (%Y%m%d) 或 20210216154500 (%Y%m%d%H%M%S)。如您所见,格式可能会有所不同。

我正在寻找一种方法将所有这些不同的字符串转换为独特的 DatetimeWithNanoseconds 格式。

我知道我可以使用如下整数将时间戳转换为 DatetimeWithNanoseconds:DatetimeWithNanoseconds(2020, 6, 22, 17, 1, 30, nanosecond=0)

这是否意味着我必须手动解析获得的每个字符串才能获得相关整数?有一个更好的方法吗 ?就像函数strptime 的工作方式一样(使用%Y%m%d 之类的字符串来确定字符串的布局)

【问题讨论】:

    标签: python datetime timestamp nanotime


    【解决方案1】:

    我了解到,从 datetime 格式中提取小时数很容易,例如只需调用 date.hour(年、月等相同)即可。

    知道了这一点,将字符串转换为 DatetimeWithNanoseconds 格式的方法只需以下两个简单步骤:

    1. 将字符串转换为日期时间格式:
    date = '19551231'
    date = datetime.datetime.strptime(date, '%Y%m%d')
    
    1. 转换为 DatetimeWithNanoseconds:
    nano = DatetimeWithNanoseconds(date.year, date.month, date.day, date.hour, date.minute, date.second, nanosecond=0)
    

    【讨论】:

      【解决方案2】:

      您提供了 8 和 14 个字符的示例时间戳。 看来您想添加 9 个或更多零, 将它们转换为统一的 23 个字符的人类可读时间戳。 到那时,这将是直截了当的 把它放在rfc 3339 格式和 调用from_rfc3339()获取DatetimeWithNanoseconds

      考虑使用一个简单的while 循环:

      while len(ts) < 23:
          ts += '0'
      return ts
      

      完成同样事情的更好方法:

      return ts + '0' * (23 - len(ts))
      

      编辑

      你会需要几个帮手。 每一个都是可单元测试的,并提供了一个非常简单的 API。

      如前所述,第一个将所有内容转换为统一的 23 字符人类可读时间戳。

      第二个将取前 14 个字符 并将其转换为自纪元以来的整数秒。 然后以纳秒为单位。 我有这样的想法:

      import datetime as dt
      
      def to_nanosec(stamp: str):
          assert 23 == len(stamp), stamp
          d = dt.datetime.strptime(stamp[:14], '%Y%d%m%H%M%S')
          return 1e9 * d.timestamp() + int(stamp) % 1e9
      

      相当于第二个任期可以是… + int(stamp[14:])

      如果返回 int 很重要,请首选 int(1e9)1_000_000_000

      你当然可以打破字符范围 并在它们之间放置:冒号和Z之类的标点符号 在致电from_rfc3339()之前, 但.strptime() 在这里可能更方便。


      值得注意的是,numpy 提供支持 对于nanosecond precision

      【讨论】:

      • 不幸的是from_rfc3339() 提高ValueError 因为它不接受我的字符串19551231,因为格式不匹配这样的东西:2019-10-12T07:20:50.52Z。在我的字符串末尾添加零并不能帮助我的字符串成为 rfc3339。有没有办法正确转换它? strptime() 在这里没有帮助,因为它将 19551231 转换为 1955-12-31 00:00:00 仍然不被 from_rfc3339() 函数接受。
      • 另外:函数from_rfc3339()返回&lt;class 'datetime.datetime'&gt;而不是&lt;class 'proto.datetime_helpers.DatetimeWithNanoseconds'&gt;
      • 哎哟!我们返回一个不支持纳秒的微秒日期时间?叹息!
      猜你喜欢
      • 2020-04-18
      • 1970-01-01
      • 2021-02-03
      • 2013-02-04
      • 2013-09-22
      • 2013-01-28
      • 2020-01-18
      • 2020-06-19
      • 2023-02-10
      相关资源
      最近更新 更多