Seite 1 von 1

Quartale und ihre Monate

Verfasst: Dienstag 12. August 2008, 17:07
von jens
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...

Verfasst: Dienstag 12. August 2008, 22:05
von HWK
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