Python:将纳秒转换为DateTime64格式

4

我有一个数据框 df,其中包含以秒为单位(自午夜以来)具有纳秒精度的timestamps列,例如34200.934549345、34205.735545344等,这些 timestamps 都来自同一天 2011-01-10

如何将这些具有纳秒精度的秒转换为 numpyDateTime64 格式?

我希望在我的 df 中将这些条目转换成 DateTime64

2011-01-10 9:30:00.934549345
2011-01-10 9:30:05.735545344

我需要执行与此示例中要求问题的SOLUTION相同的操作。

这可行吗?

3个回答

5
> df = pd.DataFrame({'seconds_since_midnight': [34200.934549345, 34205.735545344]})
> df['actual_date'] = (df.seconds_since_midnight * 1e9).astype('timedelta64[ns]') + pd.to_datetime('2011-01-10')
> df
   seconds_since_midnight                   actual_date
0            34200.934549 2011-01-10 09:30:00.934549345
1            34205.735545 2011-01-10 09:30:05.735545344

[2 rows x 2 columns]

你之前是不是用过 .astype('timedelta64[s]')? - Andy Hayden
@AndyHayden 然后我意识到它截断了小数部分。如果你注意第一个例子,日期被四舍五入到最近的秒数(我们有 2011-01-10 09:30:002011-01-10 09:30:05)。这个版本是正确的,据我所知。 - U2EF1
有趣...!我想现在考虑起来是有道理的,这就是为什么numpy可以处理皮秒等时间单位,而在pandas中ns是最小的。 - Andy Hayden
@U2EF1 谢谢!但是当我测试你的代码时,为什么会出现这个错误 TypeError: descriptor '__add__' requires a 'datetime.datetime' object but received a 'float' - Plug4
如果我在最后一行反转求和运算,我会得到“TypeError: unsupported operand type(s) for +: 'Timestamp' and 'float'”错误。 - Plug4
显示剩余5条评论

1
我使用strptime()来处理带有小数秒的字符串,并需要以微秒为单位显示。由于小数位数未定义,因此我必须处理所有可能性。我必须使用Python 2.6.7,该版本要求strptime使用整数秒,并且不允许小数部分在字符串中出现。如果我使用的是版本2.7.6,则可以使用格式的%f部分。但是,我仍然需要确保秒的小数部分只有6位数字。
import datetime DT
def mystrptime(self, val)
  vals = val.split('.')
  if len(vals) == 1:
    dt = DT.datetime.strptime(val, '%Y-%m-%d %H%M%S')
  else:
    nofrag, frag = vals
    length = len(frag)
    if length > 6:
      frag = frag[:5]
      length = len(frag) # This resets length to 6, but is not really needed
    while length < 6:
      frag = frag + '0'
      length += 1
    nofrag_dt = DT.datetime.strptime(nofrag, '%Y-%m-%d %H%M%S')
    dt = nofrag_dt.replace(microsecond=int(frag))
  return dt

一旦安装了Python 2.7.6或更高版本,可以按以下方式使用%f选项:

import datetime DT
def mystrptime(self, val)
  vals = val.split('.')
  if len(vals) > 1:
    nofrag, frag = vals
    frag = frag[:5] # This works even if frag is < 6 characters
    val = '.'.join(nofrag, frag)
  dt = DT.datetime.strptime(val, '%Y-%m-%d %H%M%S.%f')
  return dt

0

我可以使用datetime.strptime构造函数解析它,但我必须修剪字符串的最后3个字符:

>>> ds
'2011-01-10 9:30:00.934549345'
>>> datetime.datetime.strptime(ds[:-3], '%Y-%m-%d %H:%M:%S.%f')
datetime.datetime(2011, 1, 10, 9, 30, 0, 934549)

看起来允许的最细粒度级别是微秒,即一秒的百万分之一, 并且根据定义必须在六位数字内:

>>> datetime.datetime(2011, 1, 10, 9, 30, 0, 934549345)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: microsecond must be in 0..999999

既然你有纳秒级别的时间,如果想要将其转换为Python日期时间对象,你就必须失去那个精度级别,或者被迫创建自己的解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接