如何使用 python 将字符串转换为 DatetimeWithNanoseconds 格式?

How to convert a string to a DatetimeWithNanoseconds format with python?

我有多个表示时间戳的字符串。一些示例可能是: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 这样的字符串来确定字符串的布局)

您提供了 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.

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

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

  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)