Datum umschreiben, strings vs. bytearrays

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
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

Eigentlich auch wieder ein locale-Problem, aber ich gab da erst mal auf. Eine Funktion schreibt einen String, der aus einem Dictionary kommt in eine csv-Datei, aber das Datumsformat soll nach de_DE-Locale lauten, also aus

Code: Alles auswählen

2020-09-26 15:13:00 
soll

Code: Alles auswählen

26.09.2020 15:13  
werden.

Beiliegendes Testsnippet - mehr dirty als quick - tut das Gewünschte, aber mir ist klar, daß das fern jeglicher Eleganz oder Idiomatik ist.

Code: Alles auswählen

#!/usr/bin/python

day=26
month=9
year=2020
hour=15
minute=13
s="%d.%02d.%d %02d:%02d" % (day,month,year,hour,minute)
print(s)
b="2020-09-26 15:13"
print(b)
#
def nd(bstr):
    s=bytearray(17)
    b=bytearray()
    b.extend(map(ord,bstr))
    s[0]=b[8]
    s[1]=b[9]
    s[2]='.'
    s[3]=b[5]
    s[4]=b[6]
    s[5]='.'
    s[6]=b[0]
    s[7]=b[1]
    s[8]=b[2]
    s[9]=b[3]
    s[10]=' '
    s[11]=b[11]
    s[12]=b[12]
    s[13]=':'
    s[14]=b[14]
    s[15]=b[15]
    s[16]=0
   for i in range(16):
        b[i]=s[i]
    return str(b)
s=nd(b)
print(s)

Wahrscheinlich ist die 0-Terminierung zudem noch unnötig, aber alte C-Gewohnheit.. Des weiteren läuft das Beispiel anders unter python3.

Code: Alles auswählen

$ python3 s.py
26.09.2020 15:13
2020-09-26 15:13
bytearray(b'26.09.2020 15:13')
$ ./s.py
26.09.2020 15:13
2020-09-26 15:13
26.09.2020 15:13

Merke gerade, daß der Testcode, in mein Programm eingebaut, nicht läuft, sondern der String aus dem Dictionary ein datetime.datetime Objekt ist. Muß ich dann noch konvertieren in str. Oder vielleicht doch gleich ausnutzen, daß es ein datetim-Objekt ist und strftime() benutzen.
--
Grüße
Christoph
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

Was ich dann auch gemacht habe, .strftime('%d.%m.%Y %H:%M')
--
Grüße
Christoph
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Um mit Datumswerten zu arbeiten, gibt es das datetime-Modul.
Du arbeitest noch mit Python2. Das solltest Du schleunigst ändern.
Bytearrays braucht man recht selten. Auch wenn mal alles mit Stringgefummel machen möchte, würde man nicht mit einzelnen Zeichen arbeiten.
Benutze sprechende Namen. nd, s, b sind allesamt unbrauchbar, um den Code zu verstehen.

Für csv-Dateien sollte man International gebräuchliche Formate benutzen, als Y-m-d als Datum und . als Dezimaltrenner.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Bei `datetime`-Objekten kann man Zeichenkettenformatierung verwenden:

Code: Alles auswählen

In [247]: now = datetime.datetime.now()                                         

In [248]: f"{now:%d.%m.%Y %H:%M}"                                               
Out[248]: '27.09.2020 20:16'
Das komische Byte-Array-Gewurschtel macht mich ein wenig sprachlos. Unübersichtlicher geht's ja kaum. *Warum*‽

Wenn man eine Zeichenkette hat und das mit Zeichenkettenoperationen umbauen will:

Code: Alles auswählen

In [255]: date_string = "2020-09-26 15:13"                                      

In [256]: date_part, time_part = date_string.split()                            

In [257]: year, month, day = date_part.split("-")                               

In [258]: f"{day}.{month}.{year} {time_part}"                                   
Out[258]: '26.09.2020 15:13'
Wobei ich selbst in dem Fall wahrscheinlich über `datetime` gehen würde. Das ist dann ein einziger Ausdruck und der Inhalt wird dann auch gleich validiert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten