添加datetime字段以重新排列

时间:2014-11-04 16:08:08

标签: python datetime numpy

我正在尝试将日期时间字段(datetime64)附加到现有的重新排列 - 但没有太大成功。我可以创建datetime字段,但是当我尝试将它附加到记录数组时,我得到错误:

ValueError:解析日期时间字符串“?”时出错在第0位

但是,如果我将数据转换为int64,我可以毫无问题地以该格式添加数据。 (代码如下所示)

任何人都知道为什么这不起作用?

(我的最终目标是将重新排列写入netcdf文件,因此考虑到该目标的适当日期时间格式也会有所帮助)

我正在使用python 2.7.6.1,numpy 1.8.1

谢谢,Rob

import numpy as np
import numpy.lib.recfunctions as rf

# ----- make a recarray ---------    
dummy = np.arange(0,10)
datarray = np.core.records.fromarrays([dummy,dummy,dummy],names='a,b,c')

# ----- make some time data using datetime64 ---------
sec = np.arange(0,10)*1000
millisec = np.arange(0,10) 
mytime = sec + millisec

mytime64 = mytime.astype('timedelta64[ms]')         
basetime =  np.datetime64('1990-01-01') 
mydatetime = mytime64+basetime  

# ----- convert time data to int64 ---------
idatetime = mydatetime.astype('int64');

#------ try and append to recarray ---------
#  this works
datarray = rf.append_fields(datarray, 'iDateTime', data=idatetime)
# this doesnt
datarray = rf.append_fields(datarray, 'DateTime', data=mydatetime)

1 个答案:

答案 0 :(得分:1)

追溯是:

Traceback (most recent call last):
  File "stack26739733.py", line 30, in <module>
    datarray = rf.append_fields(datarray, 'DateTime', data=mydatetime, usemask=False, dtypes=mydatetime.dtype)
  File "/usr/local/lib/python2.7/site-packages/numpy/lib/recfunctions.py", line 641, in append_fields
    dtype=base.dtype.descr + data.dtype.descr)
  File "/usr/local/lib/python2.7/site-packages/numpy/ma/extras.py", line 163, in masked_all
    mask=np.ones(shape, make_mask_descr(dtype)))
  File "/usr/local/lib/python2.7/site-packages/numpy/ma/core.py", line 2644, in __new__
    _data = ndarray.view(_data, cls)
  File "/usr/local/lib/python2.7/site-packages/numpy/ma/core.py", line 2800, in __array_finalize__
    self._fill_value = _check_fill_value(None, self.dtype)
  File "/usr/local/lib/python2.7/site-packages/numpy/ma/core.py", line 402, in _check_fill_value
    dtype=ndtype,)
ValueError: Error parsing datetime string "?" at position 0

所以这个append函数构造一个蒙面数组(ma),并检查附加'dtype'的'fill_value'。显然_check_fill_value无法理解datetime dtype。看起来像蒙版数组和日期时间不兼容。可能需要numpy错误报告。


这是一个简单的,自己动手的追加:

dt1 = np.dtype(datarray.dtype.descr + mydatetime.dtype.descr)
newarray = np.empty(datarray.shape, dtype=dt1)
for n in datarray.dtype.names:
    newarray[n] = datarray[n]
newarray['f3'] = mydatetime

我用union dtype构造一个空数组。然后,我逐个字段地复制datarraymydatetime字段中的数据。由于与shape相比,字段数通常很小,因此该副本速度非常快。我很确定rf函数的功能相同。

'f3'是添加字段的默认名称。您可以在创建dt1时更改此内容。

结果是:

array([(0, 0, 0, datetime.datetime(1990, 1, 1, 0, 0)),
       (1, 1, 1, datetime.datetime(1990, 1, 1, 0, 0, 1, 1000)),
       (2, 2, 2, datetime.datetime(1990, 1, 1, 0, 0, 2, 2000)),
       ...
       (9, 9, 9, datetime.datetime(1990, 1, 1, 0, 0, 9, 9000))], 
      dtype=[('a', '<i4'), ('b', '<i4'), ('c', '<i4'), ('f3', '<M8[ms]')])

将此newarray转换为蒙版数组会产生相同的_check_fill_value错误。

np.ma.masked_array(newarray)