我正在尝试将日期时间字段(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)
答案 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构造一个空数组。然后,我逐个字段地复制datarray
和mydatetime
字段中的数据。由于与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)