Monatsname als Text ausgeben

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.
Antworten
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

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

Code: Alles auswählen

dt = datetime.strptime("21/11/06", "%B %Y")
print dt
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
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Mit strptime ein Datetime erzeugen und mit strftime ausgeben...
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

ahja, so klappts:

Code: Alles auswählen

	dt = datetime.strptime("21.11.2006", "%d.%m.%Y")
	print dt.strftime("%B %Y")
Vielen Dank!!
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Code: Alles auswählen

>>> datetime.datetime.strptime("01.06.2011", "%d.%m.%Y")
datetime.datetime(2011, 6, 1, 0, 0)
>>> 
Edit: Zu langsam. :roll:
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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")
Zuletzt geändert von jtschoch am Freitag 1. Juli 2011, 15:38, insgesamt 1-mal geändert.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

/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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
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. ;-)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

ja daran habe ich garnicht gedacht
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
karolus
User
Beiträge: 141
Registriert: Samstag 22. August 2009, 22:34

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 8)

Gruß Karo
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
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.
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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten