Python 子类化datetime64

Python 子类化datetime64,python,numpy,subclass,datetime64,Python,Numpy,Subclass,Datetime64,如何从numpy datetime64生成子类?例如,使用标准日期时间,我可以轻松地将以下子类化: import datetime as dt class SubFromDateTime(dt.datetime): def __new__(self): return dt.datetime.__new__(self, 2012, 1, 1) print type(SubFromDateTime()) >>> <class '__main__

如何从numpy datetime64生成子类?例如,使用标准日期时间,我可以轻松地将以下子类化:

import datetime as dt

class SubFromDateTime(dt.datetime):
    def __new__(self):
        return dt.datetime.__new__(self, 2012, 1, 1)

print type(SubFromDateTime())

>>> 
<class '__main__.SubFromDateTime'>
将日期时间导入为dt
类SubFromDateTime(dt.datetime):
定义新的(自我):
返回dt.datetime.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
打印类型(SubFromDateTime())
>>> 
但是,使用datetime64时,以下始终返回datetime64引用,而不是我的类

from numpy import datetime64

class SubFromDT64(datetime64):
    def __new__(self):
        return datetime64.__new__(self, '20120101')

print type(SubFromDT64())

>>>
<type 'numpy.datetime64'>
从numpy导入日期时间64
类子romdt64(日期时间64):
定义新的(自我):
返回日期时间64.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
打印类型(SubFromDT64())
>>>

我怎样才能解决这个问题?我基本上想为datetime64编写一个简单的包装器,它允许我添加自定义函数,例如使用简单的.month()方法获取给定日期的月份。在上面的示例中,我可以轻松地添加方法,在下面的示例中,它永远不会识别我的方法并认为它是datetime64对象。

我最终将ndarray子类化,从而创建了datetime64数组。对我来说,它就像一个符咒。如果有人对此感兴趣,请输入以下代码:

import numpy as np

class Date64(np.ndarray):
    def __new__(cls, data):
        data = np.asarray(data, dtype='datetime64')
        if (data.dtype != 'datetime64[D]'):
            raise Exception('Unable to parse dates adequately to datetime64[D]: %s' % data)
        obj = data.view(cls)
        return obj

    def Year(self):
        return self.astype('datetime64[Y]').astype(int) + 1970

    def Month(self):
        return self.astype('datetime64[M]').astype(int) % 12 + 1

    def Day(self):
        return (self - self.astype('datetime64[M]') + 1).astype(int)

    def ISO(self):
        if (self.shape):
            out = zip(self.Year(), self.Month(), self.Day())
            iso = [ '%04d-%02d-%02d' % each for each in out ]
        else:
            iso = '%04d-%02d-%02d' % (self.Year(), self.Month(), self.Day())
        return iso

    def Export(self):
        return self

    def __array_finalize__(self, obj):
        if obj is None:
            return


if (__name__ == '__main__'):
    a = [ dt.date(2013, 1, 1), '2012-03-01', '2012-07-02', '2012-01-03', '2012-01-04', '2011-01-05' ]
    b = Date64(a)

    print b
    print b.ISO()

作为旁注,将
\uuu new\uuu
的第一个参数
self
而不是
cls
调用有点误导。另外,为什么不使用
super
?无论如何,对于一般问题,当您调用
\uuuuu new\uuuu(cls)
时,类型通常应该返回
cls
的实例(或其子类),但没有规则规定它们必须返回,如果它们不返回,您也无能为力。对于numpy特定的问题…可能有答案,但我不知道它在我的头顶上,所以希望其他人知道。:)我尝试过的一件快速的事情是更改
\uuuu class\uuuu
属性,但是NumPy将其基类型声明为非堆类型,所以这不起作用……最后一件事:为什么要尝试这样做?如果将这些内容存储在
ndarray
中,则
dtype
将是
datetime64
object
,或者是一个自定义的
dtype
,它将值存储为
datetime64
,并在C API函数中将其视为
datetime64
,但在为Python设置框时会自动转换它们。除非您想要
对象
,否则类型是否继承
datetime64
,实际上并不重要。谢谢您的尝试。我想创建子类,因为我想保持datetime64的原始行为,但添加一些自定义函数。就像可以将子类化为ndarray(有很多这样的例子)一样,我希望将非常类似的datetime64类分为子类。