Datetime object im Datensatz

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
student123
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 16:22

Hallo Alle,
ich habe einen Datensatz (.dat), den ich korrigieren und formatieren möchte. Ich habe den Datensatz in Pycharm geöffnet. Nun geht es darum, hierfür das Datetime zu erstellen.
Der Datensatz sieht ungefähr so aus: 1;15;7;31;13;56;6;
Davon ist 1 Zeilennummer, 15 Jahr, 7 Monat, 31 Tag, 13 Stunde, 56 Minute, 6 Sekunde.
Meine Frage ist eigentlich, was das für ein Datentyp ist und ob ihr Anregungen habt, wie man daraus ein datetime machen kann?
Muss ich vll. die Daten speziell einlesen in Pycharm o.Ä.?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit Pycharm hat das doch nix zu tun. Wie soll das wissen, wie beliebige Daten zu interpretieren sind? Du musst ein Skript schreiben, das mit dem csv-Modul zB oder mit Pandas deine Datei einliest, und dann die Daten konvertieren.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Sei Dein Datensatz eine Zeile aus einer Datei

Code: Alles auswählen

s = '1;15;7;31;13;56;6;'
dann kannst Du diese direkt in ein datetime-Objekt überführen:

Code: Alles auswählen

>>> datetime.datetime(*map(int, s.split(';')[1:-1]))
datetime.datetime(15, 7, 31, 13, 56, 6)
Allerdings nur, wenn die Daten nicht 'ungefähr', sondern genau so sind. Ansonsten musst Du sie zuvor in eine passende Form bringen. Und vermutlich willst Du zur Jahreszahl auch noch 2000 addieren.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@student123: PyCharm ist ja eine IDE, um Python-Programme zu schreiben. Die Datei sieht aus, wie eine CSV-Datei, die man mit dem csv-Modul lesen kann. Welchen Datentyp Du hast, hängt dann davon ab, wie Du die Datei gelesen hast. Code zu zeigen, kann da helfen, Dein Problem besser zu verstehen.

@kbr: um das Jahr 2000-Problem zu lösen, nimmt man am besten strptime:

Code: Alles auswählen

datetime.datetime.strptime(s.split(';',1)[1], '%y;%m;%d;%H;%M;%S;')
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Sirius3: hatte ich ursprünglich Im Sinne, habe es dann aber anders gemacht. Denn die 2000 (oder vielleicht ist auch 1900 oder 1800) lässt sich auf vielfältige Weise lösen. Und wenn die Daten nur 'ungefähr' so sind, ist ohnehin jede Lösung geraten.
student123
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 16:22

Danke euch.

Ich habe eine Datei (.dat) mit 27 Werten, die mit Semikolon getrennt sind und 13000 Zeilen. Dafür möchte ich datetime erstellen. Ich bin jetzt unsicher, wo ich die Datei öffnen kann und wo ich die Befehle sende? Gibt es auch eine Möglichkeit, für alle Zeilen den Befehl auszuführen?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natuerlich kannst du ueber alle Zeilen wandern, und fuer jede Zeile etwas machen. Hast du mal ein Grundlagen-Tutorial in Python durchgearbeitet? Da werden die grundlegenden Daten- und Kontrollstrukturen erklaert.
student123
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 16:22

Hallo nochmal,
ich habe jetzt versucht, das datetime object auf folgende Weise einzufügen, aber es funktioniert leider nicht. Jemand eine Idee warum?


import csv
from csv import DictReader, DictWriter

with open('samples.csv') as f, open('samples_currated.csv', 'w') as g:
i_file = DictReader(f)
o_file = DictWriter(g, i_file.fieldnames)


o_file.writeheader()
for row in i_file:
import datetime

dt = datetime(row['Year'],
row['Month'],
row['Day'],
row['Hour'],
row['Minute'],
row['Second'])

d = dict()
dict['dt'] = dt
dict['No'] = row['No']
dict['Year'] = row['Year']
dict['Month'] = row['Month']
dict['Day'] = row['Day']
dict['Hour'] = row['Hour']
dict['Minute'] = row['Minute']
dict['Second'] = row['Second']
d['category'] = 'g'

o_file.writerow(row)


Dankee schonmal
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

"funktioniert leider nicht" ist eine schlechte Fehlerbeschreibung. Was hast Du gemacht? Was möchtest Du machen? Wie weichen Wunsch und Wirklichkeit voneinander ab? Gibt es eine Fehlermeldung? Wenn ja, wo und welcher Traceback?

Du hast noch nicht verraten, was Du eigentlich machen willst. Bisher liest Du nur Daten und schreibst sie wieder identisch raus. Das Jahr-Problem, das kbr angesprochen hat, ignorierst Du noch. Der Typ `dict` kennt keine Index-Zuweisung. Ein oder zweibuchstabige Namen sind schlecht. Variablennamen sollten ausdrücken, was in ihnen gespeichert ist. Importe gehören alle an den Anfang der Datei.
student123
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 16:22

Ich möchte Daten einlesen, diese bearbeiten und wieder ausschreiben. Dabei möchte ich ein datetime object erzeugen.

Als Error wird mit angezeigt: KeyError Year. Ich verstehe nicht, warum Year ein Error ist.

Danke für die Tipps
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@student123: Warum sollte 'Year' keinen KeyError geben? Wie sieht denn die Kopfzeile in der Eingabedatei aus?

Kann es sein das Du neue Schlüssel in das Wörterbuch schreibst, die nicht in der Eingabedatei als Spalten vorhanden sind? Was glaubst Du was in dem Fall beim Versuch so ein Wörterbuch zu speichern, passiert?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
student123
User
Beiträge: 5
Registriert: Samstag 22. September 2018, 16:22

Die Spalten der Eingabedatei sieht wie folgt aus:
“No;Year;Month;Day;Hour;Minute;Second"

Deshalb wundere ich mich so, dass der Error Year kommt
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@student123: Wundert mich nicht, denn so wie der Code jetzt ist, hast Du nur *eine* Spalte und die Überschrift für diese eine Spalte lautet: 'No;Year;Month;Day;Hour;Minute;Second'. Du möchtest vielleicht angeben an was die Spaltenwerte getrennt werden sollen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten