2017-07-21 15 views
1

私はdatetime.datetimeクラスをサブクラス化してカレンダーベースの操作を追加しようとしています。特に、週末や祝日を調整しながら、アンカー日付から日/週/月/年を加算/減算することができます。同じクラスの多くのインスタンスで繰り返しデータを避ける

はここでメソッドをカバーする必要があり抜粋です:

import datetime 
import dateutil 

class DateTime(datetime.datetime): 
    def add_workdays(cls, n = 1): 
     x = 1 
     while x <= n: 
      cls += dateutil.relativedelta.relativedelta(days=1) 
      if cls.weekday() > 4: 
       x = x 
      else: 
       x += 1 
     return DateTime(cls.year, cls.month, cls.day, cls.hour, cls.minute, 
         cls.second, cls.microsecond) 

このメソッドは自明で現在の日付に(週末のみを占める)営業日のn加算して、結果を返します。

銀行の休日の訂正を達成するために、銀行休暇を含む配列を渡すだけで済みます(セッターメソッドまたは__new__メソッドをオーバーライドすることにより)メソッドに応じて調整します。しかし、この問題は、例えば、時系列データを考慮する場合に発生します。この場合、各datetimeオブジェクトには配列のコピーが含まれていることになりますが、これは長い時系列データに対してメモリ使用量をかなり高くする可能性があります。

私の質問はこうです:洗練されたPythonプログラマはこれをどのように扱うでしょうか?私はbizdaysパッケージがこれを達成する方法を見てきましたが、同じ「欠点」に苦しんでいるようです。

他の言語では、休日の配列のインスタンスを1つだけ指し示すことができましたが、私の(確かにまばらな)Pythonの知識には、これは不可能です。日付を文字列として格納し、必要なときにのみDateTimeに変換する方が簡単ですか?

答えて

3

あなたは、単にクラス定義内の変数を追加することができます。

import datetime 

class DateTime(datetime.datetime): 
    holidays = [datetime.date(2017, 7, 4), datetime.date(2017,12,25)] # .... 

print(DateTime.holidays) 
# [datetime.date(2017, 7, 4), datetime.date(2017, 12, 25)] 

は、これは、任意のDateTimeインスタンスを含め、どこでも利用できるようになります。あなたがdictlistのSを使用することができ、複数の国のために

import datetime 

class DateTime(datetime.datetime): 
    holidays = [datetime.date(2017, 7, 4), datetime.date(2017,12,25)] # .... 

    def test_only_one_copy_of_holidays(self): # Only defined for testing purposes 
     return DateTime.holidays 

holidays1 = DateTime(2017,7,21).test_only_one_copy_of_holidays() 
holidays2 = DateTime(2017,7,30).test_only_one_copy_of_holidays() 

print(holidays1 is holidays2) # Are they the same object? 
# True 

:のみすべてのインスタンスに対して1つのコピーがあります

>>> import datetime 
>>> holidays = {'France': [datetime.date(2017,7,14), datetime.date(2017,12,25)], 'USA': [datetime.date(2017,7,4), datetime.date(2017,12,25)]} 
>>> holidays['USA'] 
[datetime.date(2017, 7, 4), datetime.date(2017, 12, 25)] 
+0

非常に興味深い、私はこれが財産だったことを知りませんでしたPythonのしかし、私は複数の国の休日に対処しなければならない場合、これはどのように機能しますか?私はちょうどXMLファイルから動的に休日の配列をロードしようとした後、 "is"ロジックを使って実証したテストを実行しましたが、同じ配列を渡してもfalseを返しました(self/clsとあなた自身のことではありません)。 –

関連する問題