Seite 1 von 2

Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 12:51
von The Hit-Man
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"

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 13:00
von The Hit-Man
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)

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 13:02
von Pekh
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.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 13:15
von 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. :-)

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 14:05
von The Hit-Man
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.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 14:15
von Pekh
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.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 14:18
von 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')

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 14:29
von The Hit-Man
@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')

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 14:42
von Dav1d
Du hast `self` vergessen ;), oder du könntest @staticmethod verwenden

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 15:15
von cofi
Dav1d hat geschrieben:Du hast `self` vergessen ;), oder du könntest @staticmethod verwenden
Noch besser: aus der Klasse schmeissen und als Funktion benutzen.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 15:20
von gkuhl
@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

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 15:23
von 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.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 15:59
von The Hit-Man
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.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 16:06
von gkuhl
Schau mal in die Dokumentation von 'datetime'. Dafür gibt es eine Methode.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 17:35
von 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!?

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 17:46
von /me
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 ...

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 17:57
von 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.

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 18:01
von snafu
@BlackJack:

Hübsch:

Bild

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

Re: Schleife aus einem Datum bilden

Verfasst: Mittwoch 9. Juni 2010, 19:31
von 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…

Re: Schleife aus einem Datum bilden

Verfasst: Donnerstag 10. Juni 2010, 08:28
von The Hit-Man
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.