子类化 Pandas DatetimeIndex

Sublcassing Pandas DatetimeIndex

我正在尝试在 python 中创建自定义日期时间 class 以支持时间序列模型。在查看了一些现有的 python 库之后,我发现 pandas DatetimeIndex class 提供了我正在寻找的大部分功能,但我仍然想添加一些方法来满足我的需要。我尝试使用自定义 init 构造函数对 DatetimeIndex class 进行 subclass ,然后调用超级 init 构造函数,但我似乎无法让它发挥作用。有没有人这样做过?如果能深入了解如何实现这一点,那就太好了。

这是我能想到的最简单的例子。这是在名为 time 的模块中定义的 class:

from pandas import DatetimeIndex

class DatetimeSub(DatetimeInex):

    def __init___(initTime):

        super().__init__(initTime)

当我使用以下代码在控制台中测试 class 时:

import numpy as np

from time import DatetimeSub

testTime =  TimeEfo2(np.arange('1985-01-01 12:00','1985-02-01 12:00', dtype="datetime64[D]"))

我收到以下错误:

TypeError: object.init() takes exactly one argument (the instance to initialize)

我不明白,因为您可以使用 datetime64 数组实例化 DatetimeIndex。此代码工作正常:

from pandas import DatetimeIndex

import numpy as np

dT = DatetimeIndex(np.arange('1985-01-01 12:00','1985-02-01 12:00', dtype="datetime64[D]"))

谢谢khuynh!这样可行。如果我想创建自己的自定义构造函数,例如:

from pandas import DatetimeIndex
import numpy as np

class DatetimeSub(DatetimeIndex):
    def __init__(self, bgnTime, endTime, unit = 'D'):
        # I am now constructing my numpy datetime64 array here:
        initTime = np.arange(bgnTime, endTime, dtype="datetime64[{}]".format(unit))
        # How do I call the super class to populate with the numpy array? This does not work:
        super().__init__(initTime)

谢谢!

构造函数的第一个参数总是self。所以如果你想传入 initTime 作为第二个参数,你需要像这样将它添加到构造函数中:

from pandas import DatetimeIndex
import numpy as np

class DatetimeSub(DatetimeIndex):
    def __init__(self, initTime):
        super().__init__()

dt = DatetimeIndex(np.arange('1985-01-01 12:00','1985-02-01 12:00', dtype="datetime64[D]"))

ds = DatetimeSub(np.arange('1985-01-01 12:00','1985-02-01 12:00', dtype="datetime64[D]"))

print(dt)

print(ds)

输出:

DatetimeIndex(['1985-01-01', '1985-01-02', '1985-01-03', '1985-01-04',
               '1985-01-05', '1985-01-06', '1985-01-07', '1985-01-08',
               '1985-01-09', '1985-01-10', '1985-01-11', '1985-01-12',
               '1985-01-13', '1985-01-14', '1985-01-15', '1985-01-16',
               '1985-01-17', '1985-01-18', '1985-01-19', '1985-01-20',
               '1985-01-21', '1985-01-22', '1985-01-23', '1985-01-24',
               '1985-01-25', '1985-01-26', '1985-01-27', '1985-01-28',
               '1985-01-29', '1985-01-30', '1985-01-31'],
              dtype='datetime64[ns]', freq=None)
DatetimeSub(['1985-01-01', '1985-01-02', '1985-01-03', '1985-01-04',
             '1985-01-05', '1985-01-06', '1985-01-07', '1985-01-08',
             '1985-01-09', '1985-01-10', '1985-01-11', '1985-01-12',
             '1985-01-13', '1985-01-14', '1985-01-15', '1985-01-16',
             '1985-01-17', '1985-01-18', '1985-01-19', '1985-01-20',
             '1985-01-21', '1985-01-22', '1985-01-23', '1985-01-24',
             '1985-01-25', '1985-01-26', '1985-01-27', '1985-01-28',
             '1985-01-29', '1985-01-30', '1985-01-31'],
            dtype='datetime64[ns]', freq=None)