Moin Leute,
ich habe das Problem, dass ich den/die Wochentag(e) ermitteln muss. Ich habe aber nur die Kalenderwoche und das Jahr zur verfügung. Habe mir schon die Hilfe von time() angesehen, finde dort aber keinen Hinweis der mich weiter bringt.
Gruss
Toeffel
Wochentage ermitteln
Den Wochentag von heute kriegst du so:
Wenn du nur das Jahr und die Kalenderwoche zur Verfügung hast, dann hast du ja wie der Name Kalenderwoche sagt ne ganze Woche?!
Das sind genau alle sieben Wochentage, wenn ich mich nicht irre ,-)
Aber ich nehme mal an du wolltest wissen, wie man zu einem konkreten Datum den Wochentag bestimmt, ansonsten würd ich mal in der Doku zum datetime-Modul gucken, damit kann man ziemlich viel machen...
edit:
Aber auch mit time dürfte das kein Problem sein:
Code: Alles auswählen
>>> from datetime import date
>>> heute = date.today()
>>> print heute
2005-09-19
>>> print heute.weekday()
0
>>> print ("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag")[heute.weekday()]
Montag
>>>
Das sind genau alle sieben Wochentage, wenn ich mich nicht irre ,-)
Aber ich nehme mal an du wolltest wissen, wie man zu einem konkreten Datum den Wochentag bestimmt, ansonsten würd ich mal in der Doku zum datetime-Modul gucken, damit kann man ziemlich viel machen...
edit:
Aber auch mit time dürfte das kein Problem sein:
The other representation is a tuple of 9 integers giving local time.
The tuple items are:
year (four digits, e.g. 1998)
month (1-12)
day (1-31)
hours (0-23)
minutes (0-59)
seconds (0-59)
weekday (0-6, Monday is 0)
Julian day (day in the year, 1-366)
DST (Daylight Savings Time) flag (-1, 0 or 1)
Code: Alles auswählen
>>> import time
>>> print time.localtime(time.time())
(2005, 9, 19, 12, 4, 45, 0, 262, 1)
>>>
Nein, ich habe wirklich nur die KW und das Jahr! Nun möchte ich wissen welches Datum dahinter steckt. Mir würde Jaschon reichen, wenn ich den Montag kenne. Die KW1 beginnt ja mit dem ersen Montag im Jahr, also teste ich erst mal auf den 1.1., ergibt dies eine Zahl > 00 dann ist der erste Tag des Jahres ein Montag, ergo beginnt das Jahr am 1.1. mit der 1. KW.
Nun finde ich aber keine Funktion die mir den Montag in einer gegebenen KW ausgiebt
Mir kommt da beim schreiben gerade eine Idee, wenn ich die angegebene KW mit 7 multiliziere und davon 7 Tage abziehe, sollte ich daoch ganz dich dran sein, nun brauche ich nur noch die Anzahl der wochentage vor der 1. KW, max. 6 ...
das Probier ich mal eben!
Töffel
Nun finde ich aber keine Funktion die mir den Montag in einer gegebenen KW ausgiebt


das Probier ich mal eben!
Töffel
Den ersten Montag im Jahr bekommst du einfach so:
Code: Alles auswählen
from datetime import date
janfirst = datetime.date(JAHR,1,1)
monday = (7-janfirst.weekday()) % 7 +1
So hier ist meine Lösung:
Kommentare sind sehr willkommen, ist ja auch erst mein 2tes Python Script!
Toeffel
Edit (Leonidas): BBCode aktiviert, damit Python-Tags wirken.
Code: Alles auswählen
#! /usr/bin/python
# Berechnung des Datuns des 1ten Wochentages einer bestimmten Kalenderwoche
# (puh ist das ein Satz)
#
# Importe
import time
import datetime
#import date
#Konstanten
Sekunden = Minuten =60
Stunden = 24
WochenTage = 7
# Globale Variablen
KW = Jahr = WochenTagOff = KWTuple = 0
def ersterWochentagdesJahres(Jahr):
"""
Hier wird berechnet, welcher Wochentag der 1.1. eines Jahres ist. Um damit weiter zurechnen,
ist es notwendig den Offset zum Montag zu haben
"""
global WochenTagOff
d = 0
d = time.localtime(time.mktime((Jahr,1,1,0,0,0,0,0,0,)))
WTO = int(time.strftime('%w',d))
if WTO == 0:
WochenTagOff = +1 # Sonntag
elif WTO == 1:
WochenTagOff = 0 # Montag
elif WTO == 2:
WochenTagOff = -1 #Dienstag
elif WTO == 3:
WochenTagOff = -2 # Mittwoch
elif WTO == 4:
WochenTagOff = -3 # Donnerstag
elif WTO == 5:
WochenTagOff = -4 # Freitag
elif WTO == 6:
WochenTagOff = -5 # Samstag
return
def berechnungWochenTag():
global KWTuple
KWTuple=((( KW * WochenTage ) + WochenTagOff ) * Sekunden * Minuten * Stunden ) # Sekunden die vergangen sind seit anfang des Jahres
KWTuple = KWTuple + time.mktime((Jahr,1,1,0,0,0,0,0,0)) # Plus die seit 1.1.1970
return KWTuple
if __name__ == '__main__':
KW = 40
Jahr = 2004
ersterWochentagdesJahres(Jahr)
berechnungWochenTag()
print time.strftime("Die Kalenderwoche " + str(KW) + " beginnt am %A,den %d.%m.%Y", time.localtime(KWTuple))
Toeffel
Edit (Leonidas): BBCode aktiviert, damit Python-Tags wirken.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hier hast du mal eine kürzere Offsetberechnung:
Bin grad dabei auch den Rest mir neu zu überdenken.
Code: Alles auswählen
import datetime
def first_monday(year):
"""
Hier wird berechnet, welcher Wochentag der 1.1. eines Jahres ist. Um damit weiter zurechnen,
ist es notwendig den Offset zum Montag zu haben
"""
date = datetime.date(year, 1, 1)
wto = date.weekday()
# mo, di, mi, do, fr, sa, so
shifts = [0, -1, -2, -3, -4, -5, +1]
offset = shifts[wto]
return offset
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Okay, ich habe das komplett neu überdacht und mir ist aufgefallen, dass ich das Modul time am besten komplett vermeide da es sich mit Timestamps grauenhaft rechnet. Stattdessen habe ich das Modul datetime ausgiebig benutzt, besonders date und timedelta.
Gestartet wirds mit
Interessierte seien noch an das Modul calendar verwiesen, damit könnte man vielleicht auch noch eine Implementation basteln.
Code: Alles auswählen
#!/usr/bin/python
# -*- encoding: latin-1 -*-
import sys, datetime
def calc_weekday(year, cw):
# get the first monday of the year
begin = first_mon(year)
# create the first monday in the year
start = datetime.date(year, 1, begin)
# get the progress (in days) of the year
progress = cw * 7 - 1
delta = datetime.timedelta(progress)
# add the progress to the year
enddate = start + delta
# calculate the begin of the week,
#+enddate ist the last day of that week (sunday)
startdate = enddate - datetime.timedelta(6)
return startdate
def first_mon(year):
"""Gets the date of the first january in the year"""
janfirst = datetime.date(year, 1, 1)
monday = (7 - janfirst.weekday()) % 7 +1
return monday
def main():
try:
year, cw = [int(value) for value in sys.argv[1:3]]
except ValueError:
print 'Syntax: python weekday.py YEAR CW'
sys.exit(1)
start = calc_weekday(year, cw)
print "Die %i. Kalenderwoche beginnt am %s." % \
(cw, start.strftime("%d.%m.%Y"))
if __name__ == '__main__':
main()
Übrigens werden globale Variablen hier nicht verändert, so vermeidet man Nebeneffekte (und das Schlüsselwort global, dass ich inzwischen für ähnlich böse halte wie exec).Kommandozeile hat geschrieben:python weekday.py 2005 38
Interessierte seien noch an das Modul calendar verwiesen, damit könnte man vielleicht auch noch eine Implementation basteln.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi!
Hab mich auch ein wenig gespielt, und bin auf folgendes gekommen:
Gruß, mawe
Hab mich auch ein wenig gespielt, und bin auf folgendes gekommen:
Code: Alles auswählen
import datetime
def kalenderwoche(year, kw):
first_monday = 4 - datetime.date(year,1,4).weekday()
monday_of_kw = first_monday + (kw - 1)*7
return range(monday_of_kw, monday_of_kw + 7)
print kalenderwoche(2005,2)
Stimmt. Naja, hier mit Monat:
Gruß, mawe
Code: Alles auswählen
import datetime
def kalenderwoche(year, kw):
fourth_of_january = datetime.date(year,1,4).weekday()
first_monday = datetime.date(year,1,4-fourth_of_january)
monday_of_kw = first_monday + datetime.timedelta(days=(kw-1)*7)
data = []
for i in range(7):
d = monday_of_kw + datetime.timedelta(days=i)
data.append("%s.%s" % (d.day, d.month))
return data
print kalenderwoche(2005,5)
Hallo,
Ich hab es auch mal versucht. Bei folgender Funktion wird die komplette Woche als Liste zurückgegeben.
Jeder Tag der Woche entspricht einen time.struct_time- tuple.
Dieser kann dann z.B. mit time.strftime() verarbeitet werden.
Ich hab es auch mal versucht. Bei folgender Funktion wird die komplette Woche als Liste zurückgegeben.
Jeder Tag der Woche entspricht einen time.struct_time- tuple.
Dieser kann dann z.B. mit time.strftime() verarbeitet werden.
Code: Alles auswählen
#Module laden
import datetime
def GetWeekDays(y, w):
"""
Returns a list with timetuple's (like time.struct_time), for
every day of week.
y = year
w = week
"""
weekdays = []
for day in range(-14, 14, 1):
day = datetime.date(y, 1, 1) + datetime.timedelta(w*7+day)
if day.isocalendar()[1] == w or weekdays and len(weekdays) < 7:
weekdays.append(day.timetuple())
return weekdays
if __name__ == '__main__' :
# Test
print GetWeekDays(2004, 01)
Gruß, Harry
Hi Toeffel,
Das errechnete Anfangsdatum der Woche mit 'w*7' gibt dieses nur ungefähr an.
Erstens beginnt nicht jede Woche am 1.1 des jeweiligen Jahres und zweites hat nicht jede Woche gleich viel Tage.
Des wegen habe ich den Suchzeitraum etwas größer gelegt (-14 bis +14 ist willkürlich von mir so festgelegt).
Man könnte genau festlegen wie groß der Suchzeitraum minimal und maximal sein muß. Ich bin einfach etwas größer gegangen und habe mich auf eben 4 Wochen beschränkt.
Das errechnete Anfangsdatum der Woche mit 'w*7' gibt dieses nur ungefähr an.
Erstens beginnt nicht jede Woche am 1.1 des jeweiligen Jahres und zweites hat nicht jede Woche gleich viel Tage.
Des wegen habe ich den Suchzeitraum etwas größer gelegt (-14 bis +14 ist willkürlich von mir so festgelegt).
Man könnte genau festlegen wie groß der Suchzeitraum minimal und maximal sein muß. Ich bin einfach etwas größer gegangen und habe mich auf eben 4 Wochen beschränkt.
Gruß, Harry
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi!
Gruß, mawe
Nur eine Anmerkung: Laut ISO-Norm ist die erste Woche des Jahres die, in der der 4. Januar liegt. Deshalb hab ich auch dieses Datum als Start gewählt, und dann auf den dazugehörigen Montag zurückgerechnet.HarryH hat geschrieben: Erstens beginnt nicht jede Woche am 1.1 des jeweiligen Jahres
Gruß, mawe
habe deinen Code komplett übersehen, tschuldige
Wenn ich das Richtig verstehe wir der Return-Wert von calc_weekday(), in die Variable start geschrieben wird. Wenn ich eine Variable benutze die vorher nicht initialisiert wurde, bekomme ich einen Fehler, dies passiert hier nicht, wieso?
Gut finde ich das mit den Übergebenen Variablen, das werde ich bestimmt nutzen können
Gruss
Toeffel

Wenn ich das Richtig verstehe wir der Return-Wert von calc_weekday(), in die Variable start geschrieben wird. Wenn ich eine Variable benutze die vorher nicht initialisiert wurde, bekomme ich einen Fehler, dies passiert hier nicht, wieso?
Gut finde ich das mit den Übergebenen Variablen, das werde ich bestimmt nutzen können

Gruss
Toeffel
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Du meinst das Script von Leonidas, oder?Toeffel hat geschrieben: habe deinen Code komplett übersehen, tschuldige

Genau.Toeffel hat geschrieben: Wenn ich das Richtig verstehe wir der Return-Wert von calc_weekday(), in die Variable start geschrieben wird.
Zeigst Du bitte mal ein Beispiel.Toeffel hat geschrieben: Wenn ich eine Variable benutze die vorher nicht initialisiert wurde, bekomme ich einen Fehler, dies passiert hier nicht, wieso?