Klasse WeekofMonth

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Stephan12
User
Beiträge: 20
Registriert: Mittwoch 29. Januar 2014, 14:52

Hallo,

ich versuche gerade, die obige Klasse mit der Methode OnOffset in datetools.py zu verstehen.
Ziel ist, eine Syntax zu finden, die mir ein True ausgibt, wenn ein Datum der auf einen dritten Freitag folgende Kalendertag ist
und zum anderen Python Code an sich lesen zu lernen.

Die Inputs der Klasse sind definiert mit:

Code: Alles auswählen

class WeekOfMonth(DateOffset, CacheableOffset)
Dann gibts noch

Code: Alles auswählen

def __init__(self, n=1, **kwds):
        self.n = n
        self.weekday = kwds['weekday']
        self.week = kwds['week']
Wenn ich als User Weekofmonth benutze, gebe ich jedoch nur zwei Zahlen ein in der Form
x) WeekOfMonth(2,4)

Was bedeuten DateOffset, CacheableOffset und was machen die an dieser Stelle der Klassendefinition?

mit **kwds wird ein dictionary erzeugt, allerdings muss da doch beim Methodenauffruf immer Keyword und Value eingegeben werden,
wenn nur Values eingegeben werden wie bei x) , müsste doch eigentlich ein Error folgen. Tuts aber nicht. Wieso?

UNd: Was macht getOffsetOfMonth(self, dt)?
Was ist dt für eine Art von Input und wo kommt der her, wenn ich z.B.
WeekOfMonth(2,4).OnOffset eingebe?

Danke für die Infos!
Stephan
Zuletzt geändert von Anonymous am Donnerstag 13. Februar 2014, 16:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Stephan12
Bei Deinen Fragen zu `datetools` kann ich Dir nicht helfen, ich kenne das Modul nicht.
Auf einen bestimmten Tag im Monat zu kommen, habe ich so gelöst:

Code: Alles auswählen

def weekdays_delta(date, step, weekday):
    '''weedays_delta(date, step, weekday) -> int

    The returning integer marks the distance between
    `date` and the `step`-times remotest `weekday`
    in days.
    `date` must be a `dt.DateTime` object.
    `step` must be an integer. If `step` is
      - zero    : points to the next `weekday`
      - positive: points `step` weeks after next `weekday`
      - negative: points `step` weeks before next `weekday`
    `weekday` must be an integer in range 0 - 6 whereby
    0=mo till 6=su. '''
    def weekday_distance(from_, till):
        weekdays = (0, 1, 2, 3, 4, 5, 6)
        return (weekdays[from_:] + weekdays[0:from_]).index(till)
    first_weekday = date.weekday()
    distance = weekday_distance(first_weekday, weekday) + step * 7
    return distance

Code: Alles auswählen

>>> import datetime
>>> reference = datetime.date.today().replace(day=1)
>>> days = weekdays_delta(reference, 2, 4) + 1
>>> reference + datetime.timedelta(days=days)
datetime.date(2014, 2, 22)
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@Stephan12: `DateOffset` und `CacheableOffset` sind die Basisklassen von `WeekOfMonth`, das heisst `WeekOfMonth` erbt die Methoden von diesen beiden Klassen.

Wieso ein `WeekOfMonth(2, 4)` bei Dir keine Ausnahme zur Folge hat kann ich Dir nicht erklären, denn ich bekomme die wie erwartet:

Code: Alles auswählen

In [6]: pd.datetools.WeekOfMonth(2, 4)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-375c25bbfe7a> in <module>()
----> 1 pd.datetools.WeekOfMonth(2, 4)

TypeError: __init__() takes at most 2 arguments (3 given)
Die Methode `getOffsetOfMonth()` erwartet ein `datetime`-Objekt, beziehungsweise wenn man in den Quelltext schaut, irgend ein Objekt das die Attribute `year` und `month` besitzt und gibt für das gegebene Jahr und den Monat ein `datetime`-Objekt zurück welches dem Wochentag in der Woche (Zahl) entspricht, die `WeekOfMonth` beim erstellen als `weekday` und `week` übergeben wurden.

Wenn Du nur ``WeekOfMonth(week=2, weekday=4).onOffset`` eingibst, dann kommt das `datetime`-Exemplar nirgend wo her denn `onOffset()` wird hier ja gar nicht aufgerufen und damit auch `getOffsetOfMonth()` nicht. Wenn man die `onOffset()`-Methode aufruft, dann muss man das mit einem `datetime`-Objekt tun und das wird dann auch an `getOffsetOfMonth()` übergeben.

Ein Test ob ein Datum der Tag nach dem dritten Freitag ist, könnte zum Beispiel so aussehen in dem man einen Tag von dem Datum abzieht und dann schaut ob der Tag ein dritter Freitag im Monat ist (ungetestet):

Code: Alles auswählen

from pandas.datetools import Day, getOffset


is_3rd_friday = getOffset('WOM-3FRI').onOffset

def is_day_after_3rd_friday(date):
    return is_3rd_friday(date - Day(1))
Antworten