Seite 1 von 1

Datum umschreiben, strings vs. bytearrays

Verfasst: Sonntag 27. September 2020, 15:34
von Krischu
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.

Re: Datum umschreiben, strings vs. bytearrays

Verfasst: Sonntag 27. September 2020, 16:05
von Krischu
Was ich dann auch gemacht habe, .strftime('%d.%m.%Y %H:%M')

Re: Datum umschreiben, strings vs. bytearrays

Verfasst: Sonntag 27. September 2020, 16:09
von Sirius3
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.

Re: Datum umschreiben, strings vs. bytearrays

Verfasst: Sonntag 27. September 2020, 19:28
von __blackjack__
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.