Подкассинг Pandas DatetimeIndex - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать пользовательский класс datetime в python для поддержки модели временных рядов. Изучив некоторые из существующих python библиотек, я обнаружил, что класс pandas DatetimeIndex предоставляет большую часть функций, которые я ищу, но я все же хотел бы добавить некоторые методы для своих нужд. Я попытался создать подкласс класса DatetimeIndex с помощью пользовательского конструктора init , а затем вызвать конструктор super init , но я не могу заставить его работать. Кто-нибудь делал это? Было бы здорово получить некоторое представление о том, как это сделать sh.

Это пример простейшего примера, который я могу придумать. Вот класс, определенный в модуле с именем time:

from pandas import DatetimeIndex

class DatetimeSub(DatetimeInex):

    def __init___(initTime):

        super().__init__(initTime)

Когда я тестирую класс в консоли с помощью следующего кода:

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 () принимает ровно один аргумент (экземпляр для инициализации)

Что я не понимаю, потому что вы можете создать экземпляр DatetimeIndex с массивом datetime64. Этот код отлично работает:

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]"))

Спасибо, хуинх! Это работает. А как насчет того, если бы я хотел создать свой собственный конструктор, такой как:

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)

Спасибо!

1 Ответ

0 голосов
/ 03 мая 2020

Первый аргумент конструктора всегда 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)

output:

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)
...