首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对datetime64进行子类化

对datetime64进行子类化
EN

Stack Overflow用户
提问于 2014-11-25 06:38:16
回答 1查看 248关注 0票数 3

如何从numpy datetime64中子类化?例如,使用标准的datetime,我可以很容易地子类化:

代码语言:javascript
复制
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'>

但是,使用datetime64时,以下代码总是返回datetime64引用,而不是我的类...

代码语言:javascript
复制
from numpy import datetime64

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

print type(SubFromDT64())

>>>
<type 'numpy.datetime64'>

我该如何解决这个问题呢?基本上,我想为datetime64编写一个简单的包装器,它允许我添加自定义函数,比如用一个简单的.Month()方法获取给定日期的月份。有了上面的例子,我可以很容易地添加方法,在下面的例子中,它永远不会识别我的方法,并认为它是一个datetime64对象。

EN

回答 1

Stack Overflow用户

发布于 2014-11-25 22:39:14

我结束了ndarray的子类化,它创建了一个datetime64数组。对我来说就像是一种魔力。如果有人对这里的代码感兴趣:

代码语言:javascript
复制
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()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27115491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档