Schleife aus einem Datum bilden

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.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ist es möglich, eine Schleife zu bauen, von einem StartDatum zu einem EndDatum? Also zum Beispiel vom 3.12.1976 bis zum 5.9.1988. Ich stelle mir das irgendwie so vor. Das geht natürlich nicht:

Code: Alles auswählen

start_datum = date(1976, 4, 8)
ende_datum = date(1988, 5, 10)
for x in range (start_datum, ende_datum):
	print "hier wäre dann die schleife"
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Diese Lösung geht:

Code: Alles auswählen

from datetime import date
from random import randint
from datetime import timedelta

start_date = date(1976, 4, 8)
end_date = date(1988, 5, 10)


day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
	print str(single_date.day) + "." + str(single_date.month) + "." + str(single_date.year)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Mit

Code: Alles auswählen

import datetime
day = datetime.date(2009,1,1)
next_day = day + datetime.timedelta(days=1)
bekommst du den jeweils nächsten Tag. Ich würde mir also einen Generator basteln, der mir auf diese Weise immer das nächste Datum ermittelt und irgendwann StopIteration wirft.
BlackJack

Und das formatieren als Zeichenkette mit der `strftime()`-Methode. Oder zumindest mit dem ``%``-Operator, aber nicht mit `str()` und ``+``. Das ist doch kein BASIC hier. :-)
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Mensch Leute, bin doch nochn Anfänger ;). Ich denke mich in die Sache gerade erst mal rein. Ich meine, ich habe schon in php, C+ und Java programmiert, immer nur so bruchweise. Python gefällt mir bis jetzt noch am besten.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

The Hit-Man hat geschrieben:Mensch Leute, bin doch nochn Anfänger ;). Ich denke mich in die Sache gerade erst mal rein. Ich meine, ich habe schon in php, C+ und Java programmiert, immer nur so bruchweise. Python gefällt mir bis jetzt noch am besten.
Immer locker bleiben. Kritik ist hier selten bösartig gemeint. In der Regel versuchen wir nur, Anregungen zu geben und die richtigen Stichworte zu nennen, damit der Fragende sich dann gezielt weiterbilden kann. Und nur durch solche Hinweise lernt man dann ja auch wirklich, was man besser machen könnte. An den manchmal etwas ruppigen Ton wirst du dich gewöhnen müssen - ist, wie schon gesagt, nicht böse gemeint und eher der Tatsache geschuldet, daß man die Zeit, die man für das höfliche Ausformulieren benötigt, ja auch gut für andere Fragen verwenden kann.
BlackJack

Das ganze mal in "pythonisch" und ausformuliert. :-)

Code: Alles auswählen

from datetime import date as Date, timedelta as TimeDelta


def iter_dates(start, end):
    current = start
    while current < end:
        yield current
        current += TimeDelta(days=1)


def main():
    start = Date(1976, 4, 8)
    end = Date(1988, 5, 10)
    for date in iter_dates(start, end):
        print date.strftime('%d.%m.%Y')
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

@Pekh
Ich bin ja auch nicht böse ;)

@BlackJack
Danke für den Vorschlag. Aber hey, hatte gerade versucht um meine Routine, dann ne Klasse zu basteln, der ich dann nur noch start_date und end_date übergeben wollte, aber so einfach scheint das gar nicht zu sein. Die Klasse meldet mir immer, ich würde zu viele Argumente übergeben, dabei sind es ja nur zwei. Ich denke mal eben ein Datum zu übergeben, an eine Klasse ist nicht so einfach, oder?

Code: Alles auswählen

mymakereports.generateReports (date(1976, 4, 8), date(1976, 5, 8))
EDIT:
das geht leider hier auch nicht.

Code: Alles auswählen

	def iter_dates(start, end):
		current = start
		while current < end:
			yield current
			current += TimeDelta(days=1)

if __name__ == "__main__":
    mymakereports = makereports ()
    start = date(1976, 4, 8)
    end = date(1988, 5, 10)
    for date in mymakereports.iter_dates(start, end):
        print date.strftime('%d.%m.%Y')
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du hast `self` vergessen ;), oder du könntest @staticmethod verwenden
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dav1d hat geschrieben:Du hast `self` vergessen ;), oder du könntest @staticmethod verwenden
Noch besser: aus der Klasse schmeissen und als Funktion benutzen.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@The Hit-Man: "makereports" ist kein (guter) Name für eine Klasse, da es eher wie eine Funktion klingt. Wenn du etwas programmieren willst, dass dir einen Report erstellt, wäre daher eine Funktion sinnvoller. In Python verwendet man Klassen nur wenn es angebracht ist. Ein Name für eine Klasse wäre z.B. "Report".

Da "iter_dates" nicht so viel mit dem Report selbst zu tun hat, wäre auch hier eine eigenständige Funktion sinnvoller. Dann kann man sie auch für andere Dinge verwenden.

Grüße
Gerrit


Edit: cofi war schneller
BlackJack

Wobei sich da die Frage stellt ob das auf die Klasse gehört wenn gar nicht auf das Exemplar zugegriffen wird.

Und Namen von Klassen sollten laut Style-Guide in "MixedCase" geschrieben werden. Dann muss man sich nicht irgendwelche Zusätze wie "my" ausdenken wenn man ein Exemplar von der Klasse erstellt. Das alleine reicht noch nicht wirklich weil `MakeReports` kein vernünftiger Klassenname ist. Klassen repräsentieren im weitesten Sinne "Dinge" und sollten deshalb nicht wie Tätigkeiten benannt werden. Das sind die Namen für Funktionen und Methoden, denn die repräsentieren in der Regel Tätigkeiten.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich versuche mich an die Sachen zu halten, aber stamme aus den Assembler Zeiten auf dem C64er. Ist nicht leicht einen schlechten Programmierstiel abzulegen. Nunja, ich hätte noch eine weitere Frage. Wie bekomme ich die Wochentage raus? mit der Routine von BlackJack bekomme ich die Startwoche raus, kein Thema ( der Generator soll wöchtig eingesetzt werden, also jeder Bericht für eine Woche ), d.h. habe ich BlackJack seine Routine auf days=7 gestellt. Da kann ich ja auch dann das Startdatum einer Woche auslesen. Doch wie bekomme ich das EndDatum einer Woche da raus? Einfach 7 hin zuaddieren ging ja leider nicht.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Schau mal in die Dokumentation von 'datetime'. Dafür gibt es eine Methode.
BlackJack

@The Hit-Man: Man kann auch als 6510-Assembler-Geschädigter noch ein guter Programmierer werden. Ich biete mich hier als lebender Beweis an: BlackJack/Civitas :-)

Wenn man das Startdatum einer Woche hat, wieso kann man dann nicht einfach sieben Tage hinzuaddieren um das Enddatum zu bekommen!?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@The Hit-Man: Man kann auch als 6510-Assembler-Geschädigter noch ein guter Programmierer werden.
Ja schon, aber wie lege ich die Variableninhalte bei Python in die Zero-Page? ;-)
BlackJack hat geschrieben:Wenn man das Startdatum einer Woche hat, wieso kann man dann nicht einfach sieben Tage hinzuaddieren um das Enddatum zu bekommen!?
Weil man dann auf dem Startdatum der nächsten Woche ist ...
BlackJack

@/me: Hm, das ungefähre Äquivalent zu Variablen in der Zeropage wären wohl `__slots__`. :-)

Okay, es ist einfach zu warm hier. Übersehe ich noch ein offensichtliches Problem wenn ich nur sechs Tage addiere? Wobei -- wenn das als Enddatum für die Generatorfunktion weiter oben dient, dann wäre sieben schon richtig, weil der Iterator in bester Python-Tradition den Endwert *nicht* mehr liefert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@BlackJack:

Hübsch:

Bild

Nur leider kann ich die Datei mit keinem Editor anzeigen. Vermutlich etwas kompiliertes, oder?
BlackJack

@snafu: D64 sind Diskettenimages von 5¼"-Disketten für das VC1541-Diskettenlaufwerk von Commodore. Wenn man kein echtes Laufwerk hat, kann man die auch im passenden Emulator in das virtuelle Laufwerk stecken. :-)

Wobei das spezielle Werkzeug von dem Du da das Bildschirmfoto zeigst, noch ein wenig Kenntnis von der Speicherbelegung und den Registern des Sound-Chips erfordert, um es sinnvoll(?) nutzen zu können.

Und Du erinnerst mich daran, dass ich die Informationen über die Programme in der CSDB mal überarbeiten und vervollständigen müsste. Die habe ich da nämlich nicht selbst reingestellt…
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

tja, manchmal vermisse ich dir guten alten Zeiten auf dem C64er. Allerdings fährt unsere Truppe noch immer zur BreakPoint und anderen Meetings. Die BreakPoint ist ja nun nicht mehr. Die nächste Fete steht in Bochum an, beim Dienstagstreff.

http://www.dienstagstreff.de/de/index.php3

Wenn man überlegt, welche Sprünge die Technik in den letzten Jahren gemacht hat, unglaublich. Wer programmiert heute noch etwas in Assebmler. Vielleicht einige Zeitkritsche Anwendungen. Nach dem C64er, hatte ich es auch auf dem Amiga probiert und dann auf dem PC. Allerdings gibt es kaum gute Dokus über Assebmler/Linux. Als ich mit dem PC damals anfingt, kannte ich nur die Sprachen Basic, Pascal, C++. Alle anderen waren mir unbekannt.

Ich hätte eher mit Python anfangen sollen.
Antworten