Seite 1 von 1
Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 15:04
von andi24
Hallo zusammen,
folgendes Problem: Mir liegt ein Datum als String vor (wird mir so überliefert - kann ich gerade leider nicht ändern):
mydate="01.06.2011"
und ich möchte dafür gerne "Juni 2011" ausgeben.
Mein Versuch:
Ich wollte mir das Datum zunächst per "String ausschneiden" in einen "echten Datumswert" überführen und dann mit entsprechendem Format-Parameter ausgeben:
Leider bringt
jedoch die Fehlermeldung
Code: Alles auswählen
ValueError: time data '21/11/06' does not match format '%B %Y'
Weiß jemand, wie ich das hinkriegen kann? Ich bin auch gern für bessere Herangehensweisen offen...Auf
http://docs.python.org/library/datetime.html hab ich mich schon ne Zeit rumgeschlagen
Vielen Dank für jeden Tip,
Andi
Re: Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 15:07
von Liffi
Mit strptime ein Datetime erzeugen und mit strftime ausgeben...
Re: Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 15:17
von andi24
ahja, so klappts:
Code: Alles auswählen
dt = datetime.strptime("21.11.2006", "%d.%m.%Y")
print dt.strftime("%B %Y")
Vielen Dank!!
Re: Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 15:22
von nomnom
Code: Alles auswählen
>>> datetime.datetime.strptime("01.06.2011", "%d.%m.%Y")
datetime.datetime(2011, 6, 1, 0, 0)
>>>
Edit: Zu langsam.

Re: Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 19:07
von jtschoch
Versuche mal das:
Code: Alles auswählen
import time
Datum = time.strftime("%d.%m.%Y",time.gmtime())
print (Datum)
oder mit meheren funktionen:
Code: Alles auswählen
jahrzahl = time.strftime("%j",time.gmtime())
aktwoche = time.strftime("%U",time.gmtime())
Wochentag = time.strftime("%A",time.gmtime())
Datum = time.strftime("%d.%m.%Y",time.gmtime())
wochen = {
"Monday" : "Montag",
"Tuesday" : "Dienstag",
"Wednesday" : "Mittwoch",
"Thursday" : "Donnerstag",
"Friday" : "Freitag",
"Saturday" : "Samstag",
"Sunday" : "Sonntag"
}
print ("Wochentag " + wochen["" + Wochentag] + " " + Datum + " Woche: " + aktwoche + "/53 Tag: " + jahrzahl + "/366")
Re: Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 20:48
von /me
jtschoch hat geschrieben:Code: Alles auswählen
jahrzahl = time.strftime("%j",time.gmtime())
aktwoche = time.strftime("%U",time.gmtime())
Wochentag = time.strftime("%A",time.gmtime())
Datum = time.strftime("%d.%m.%Y",time.gmtime())
wochen = {
"Monday" : "Montag",
[...]
}
print ("Wochentag " + wochen["" + Wochentag] + " " + Datum + " (Woche: " + aktwoche + "/53 Tag: " + jahrzahl + "/366)")
Du hast irgendwie eine Vorliebe für Katastrophenprogrammierung.
Die gewählten Namen für die Bezeichner sind größtenteils unglücklich und der konsequente Verzicht auf saubere Stringformatierung macht das ganze einfach nur unübersichtlich. Die "/53" und "/366" runden das ganze dann sehr schön (falsch) ab.
Re: Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 21:52
von anogayales
/me hat geschrieben:Die "/53" und "/366" runden das ganze dann sehr schön (falsch) ab.
Da wird doch nix gerundet, nur konkateniert. Trotzdem sehr unübersichtlich. Stichwort: String Formatting.
Grüße,
anogayales
Re: Monatsname als Text ausgeben
Verfasst: Mittwoch 29. Juni 2011, 21:54
von cofi
anogayales hat geschrieben:/me hat geschrieben:Die "/53" und "/366" runden das ganze dann sehr schön (falsch) ab.
Da wird doch nix gerundet, nur konkateniert.
Falsches "abrunden", denk an "Gesamtbild abrunden", nicht "Zahl abrunden".

Und nunja es wird durchaus gerundet -- wenn auch nicht durch Python, aber eben auf und nicht ab.
Re: Monatsname als Text ausgeben
Verfasst: Freitag 1. Juli 2011, 15:36
von jtschoch
Das ist die Anzahl von Tagen...
z.B. 1/366
Ich hatte das als Titel für ein Programm (Wetterprogramm) bei Tkinter aut hervorragend funktioniert
Re: Monatsname als Text ausgeben
Verfasst: Freitag 1. Juli 2011, 15:57
von BlackJack
@jtschoch: Die Anzahl von Tagen von was? Einem Jahr? Dann solltest Du vielleicht noch mal einen Kalender zur Hand nehmen und die nachzählen. Vorzugsweise bei einem Jahr, das kein Schaltjahr ist.

Re: Monatsname als Text ausgeben
Verfasst: Freitag 1. Juli 2011, 16:00
von Xynon1
@jtschoch
Wenn du das schon so machen willst (was ich für keine besonders gute Idee halte), dann nimm doch wenigsten 365.25 - Damit liegst du dann immerhin ca. 100 statt 3 Jahre richtig.
Re: Monatsname als Text ausgeben
Verfasst: Samstag 2. Juli 2011, 09:33
von jtschoch
ja daran habe ich garnicht gedacht
Re: Monatsname als Text ausgeben
Verfasst: Samstag 2. Juli 2011, 10:02
von karolus
Hallo
jtschoch hat geschrieben:ja daran habe ich garnicht gedacht
Da befindest du dich in honoriger Gesellschaft:
http://support.microsoft.com/kb/214326/de. Die Herrschaften haben dennoch ihr Produkt relativ erfolgreich etabliert
Gruß Karo
Re: Monatsname als Text ausgeben
Verfasst: Samstag 2. Juli 2011, 11:17
von sma
Statt selbst zu übersetzen, kann man das auch Python machen lassen:
Code: Alles auswählen
import locale, datetime
locale.setlocale(locale.LC_TIME, locale.normalize("de"))
dt = datetime.datetime.strptime("2011-07-02", "%Y-%m-%d")
print dt.strftime("%A")
Der Vorteil ist, dass es keine Verwirrung gibt, welches wohl der erste Tage der Woche ist, das je nach Kalender nämlich unterschiedlich ist. Allerdings scheint mir Python hier sehr auf den westlichen Weg festgelegt zu sein. In einem sehr interessanten (nur für Apple-Entwickler) zugänglichen Talk von der WWDC habe ich gerade gelernt, wie verdammt kompliziert das Thema Kalender eigentlich ist. In Samoa wird es dieses Jahr z.B. keinen 30.12. geben, der ist gestrichen, weil sie ihre Zeitzone ändern. Ich verstehe auch nicht - anderes Thema - warum Python nach 20 Jahren immer noch nicht Zeitzonen direkt unterstützt - sonst ist man doch auf "Batteries included" so stolz. Nur in diesem Fall soll man eine Extrabibliothek installieren? WTF.
Stefan
Re: Monatsname als Text ausgeben
Verfasst: Samstag 2. Juli 2011, 11:51
von deets
@sma
Ganz einfach: wenn ein Paket in die Standardbibliothek eingehen soll, muss sich jemand finden, der es zuverlaessig maintained. Und da hakt es dann meistens. So wird das auch hier sein. Und Angesichts der Tatsache, dass sogar der Maintainer der eigentlichen Time-Zone-Specs in Rente geht (
http://tech.slashdot.org/story/11/03/03 ... r-Retiring) ist ein Einbau in die stdlib (an die Leute nicht zu unrecht den Anspruch haben, dass es problemlos funktioniert) erst recht unwahrscheinlich.
Re: Monatsname als Text ausgeben
Verfasst: Samstag 2. Juli 2011, 11:55
von BlackJack
Bei Zeitzonen hat man auch das Problem, dass die Daten sich verglichen mit den Releasezyklen von Python sehr oft ändern. Man könnte von Python-Seite aus also keine Aktualität garantieren.
Re: Monatsname als Text ausgeben
Verfasst: Samstag 2. Juli 2011, 12:24
von sma
Ich verstehe nicht, wieso das ein Problem von Python ist. Mein Betriebssystem kann das auch ohne Python, ergo kann (und sollte) Python doch die Betriebssystem-Funktionen nutzen. Oder ist hier das Problem, dass das dann nicht plattformübergreifend funktioniert? IMHO haben wir auch zwei Aspekte: Zum einen eine Abbildung von Strings wie "Europe/Berlin" und Abkürzungen wie "PST" auf die Stunden-Offsets und zum anderen das Berücksichtigen dieser Offsets. Ein Datetime-Objekt sollte niemals eine lokale Zeit sein, sondern immer basierend auf UTC (1.1.1970 00:00 Z oder so). Nur für die Ausgabe kann jetzt eine Zeitzone berücksichtigt werden.
An die aktuelle Zeit nach UTC komme ich ja mit datetime.datetime.utcnow(). Will ich diese nun anzeigen, z.B. mit "%H:%M", bekommt ich 11:08 obwohl meine Uhr 13:08 zeigt. Statt der Ausgabe beizubringen, welche Zeitzone ich will, muss ich's leider dem Datetime-Objekt sagen. Nachträglich zuweisen kann ich's aber auch nicht.
Also muss ich erst mal eine Unterklasse von datetime.tzinfo machen, z.B. so (das Beispiel in der Doku ist da übrigens falsch):
Code: Alles auswählen
class TZ(datetime.tzinfo):
def __init__(self, offset): self.offset = offset
def utcoffset(self, dt): return offset
def dst(self, dt): return datetime.timedelta(0)
Und schon kann ich mit datetime.datetime.utcnow().replace(tzinfo=TZ(120)).strftime("%H:%M") die lokale Zeit ausgeben.
Könnte nicht wenigstens so eine Klasse beiliegen? Das GMT+0200 jetzt diverse Abkürzungen hat, ist mir doch egal.
Stefan