Python:将纳秒转换为DateTime64格式

时间:2014-03-06 00:42:50

标签: python numpy pandas

我在一秒钟内(从午夜开始)有一列timestamps,其中包含34200.934549345, 34205.735545344等纳秒精度,依此类推在DataFrame df中。

这些timestamps来自同一天2011-01-10

如何以DateTime64 numpy格式转换这些秒以纳秒精度?

我想在df

中添加这些条目
2011-01-10 9:30:00.934549345
2011-01-10 9:30:05.735545344

我需要在问题的解决方案下执行与此example中相同的操作。

有可能吗?

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

答案 2 :(得分: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)

似乎允许的最终粒度级别为microseconds, which are one millionth of a second,根据定义,必须在六位数内:

>>> 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日期时间对象,您将不得不失去这种精确度,或者被迫创建自己的解决方法。