Quartale und ihre Monate

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Gibt es eine Möglichkeit in Python mit Quartale umzugehen?

Ich hab mir das gebastelt:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import datetime

def build_choices(oldest, newest, reverse=False):
    assert(oldest<newest)

    time_range = range(oldest.year, newest.year+1)
    roman_range = ["I", "II", "III", "IV"]
    if reverse:
        time_range.reverse()
        roman_range.reverse()

    choices = []
    no = 0
    for year in time_range:
        for roman in roman_range:
            no += 1
            choices.append(
                (no, "%s.%s" % (roman, year))
            )
    return choices

print build_choices(
    datetime.date(2007, 1, 1), datetime.date(2008, 12, 31)
)

# Eigentlich nur von II.2008 bis III.2007
print build_choices(
    datetime.date(2007, 7, 1), datetime.date(2008, 5, 1), reverse = True
)
Ausgabe:

Code: Alles auswählen

[(1, 'I.2007'), (2, 'II.2007'), (3, 'III.2007'), (4, 'IV.2007'), (5, 'I.2008'), (6, 'II.2008'), (7, 'III.2008'), (8, 'IV.2008')]
[(1, 'IV.2008'), (2, 'III.2008'), (3, 'II.2008'), (4, 'I.2008'), (5, 'IV.2007'), (6, 'III.2007'), (7, 'II.2007'), (8, 'I.2007')]
Aber es berücksichtigt immer nur das ganze Jahr, siehe zweiter Test.

EDIT: Ziel ist es eigentlich eine Quartal-Auswahl in django's forms zu erstellen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Etwa so?

Code: Alles auswählen

import datetime

def build_choices(oldest, newest, reverse=False):
    assert(oldest < newest)

    time_range = range(oldest.year, newest.year + 1)
    roman_range = ["I", "II", "III", "IV"]

    choices = []
    for year in time_range:
        for i, roman in enumerate(roman_range):
            if oldest <= datetime.date(year, 3 * i + 1, 1) <= newest:
                choices.append('%s.%s' % (roman, year))
    if reverse:
        choices.reverse()
    return list(enumerate(choices))

print build_choices(
    datetime.date(2007, 1, 1), datetime.date(2008, 12, 31)
)

# Eigentlich nur von II.2008 bis III.2007
print build_choices(
    datetime.date(2007, 7, 1), datetime.date(2008, 5, 1), reverse = True
)
Ausgabe

Code: Alles auswählen

[(0, 'I.2007'), (1, 'II.2007'), (2, 'III.2007'), (3, 'IV.2007'), (4, 'I.2008'), (5, 'II.2008'), (6, 'III.2008'), (7, 'IV.2008')]
[(0, 'II.2008'), (1, 'I.2008'), (2, 'IV.2007'), (3, 'III.2007')]
MfG
HWK
Antworten