1

I am trying to create a custom datetime class in python to support a time series model. After reviewing some of the existing python libraries I found that the pandas DatetimeIndex class provides much of the functionality I am looking for, but I would still like to add some methods for my needs. I have tried to subclass the DatetimeIndex class with a custom init constructor and then call the super init constructor, but I can't seem to get this to work. Has anyone done this? It would be great to get some insight on how to accomplish this.

This is about the simplest example I can think of. Here is a class defined in a module called time:

from pandas import DatetimeIndex

class DatetimeSub(DatetimeInex):

    def __init___(initTime):

        super().__init__(initTime)

When I test the class in the console with the following code:

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

I get the following error:

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

Which I don't understand because you can instantiate DatetimeIndex with a datetime64 array. This code works fine:

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

Thanks khuynh! That works. And how about if I wanted to create my own custom constructor such as:

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)

Thanks!

hydrophile
  • 21
  • 3
  • 2
    You will need to provide a [mre] and an explanation of how your subclass is mis-behaving. – wwii May 01 '20 at 20:27

1 Answers1

0

The first argument to a constructor is always self. So if you want to pass in initTime as a second argument, you'll need to add it to the constructor like so:

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)
kennyvh
  • 2,526
  • 1
  • 17
  • 26
  • khuynh - thanks for the reply. I'm still unclear on how to call the superclass to to provide the initTime variable to populate the subclass. Thanks – hydrophile May 04 '20 at 04:54
  • @hydrophile you can call it just like I did in my example. see my edit for the output – kennyvh May 04 '20 at 06:55
  • That works. I was hoping to create a custom constructor that also included some additional arguments to populate added properties. I think my best option here might be to just create a wrapper class for the DatetimeIndex. Thanks! – hydrophile May 06 '20 at 14:46