iso8601 date string in seconds umwandeln und auf list oder array anwenden.

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

Ziel ist es, die gps-Daten über der Zeit in einem 3D-Plot zu plotten. Dazu wollte ich die Einheit "Sekunden" verwenden und zwar delta von der Startzeit T0.

Die Iso 8601 Timestamps kann ich (s.u.) in Sekunden umwandeln, allein der Schritt, dies auf das Array oder die Liste von Timestamps, die ich aus der DataFrame-Kolumne 'DATE' entnommen habe, gelingt mir nicht. Vielleich kann mir jemand einen Tipp geben:

Code: Alles auswählen

import numpy as np
import pandas as pd
import dateutil.parser as dp
import time
import dateutil.parser as dp

data= {
        "DATE": ["2022-02-24T14:09:07.000Z",
                 "2022-02-24T14:09:08.000Z",
                 "2022-02-24T14:09:09.000Z",
                 "2022-02-24T14:09:10.000Z"],
        "LAT": [52.8464488,
                52.8464512,
                52.8464556,
                52.8464613,],
        "LON": [14.2807312,
                14.280736,
                14.2807427,
                14.2807463],
        "NN": [516.521,
               516.537,
               516.398,
               516.58]
      }

my_date = datetime.now()
df = pd.DataFrame(data)
print (df)
#print(df.info()) 
#print(df.loc[:,'LAT'])
#output_list = list(map(double, integer_list))
at=np.array(df.loc[:,'DATE'].tolist())
t0=at[0]
print("\nErstes DATE Element:",t0)
pt=list(at)
parsed_t = dp.parse(t)
t0_in_seconds = parsed_t.timestamp()
print("         in seconds:",t0_in_seconds)
print()
print(at)
print(pt)


--
Grüße
Christoph
derElch
User
Beiträge: 33
Registriert: Sonntag 25. Februar 2018, 13:14

Die betreffende Spalte mit:

Code: Alles auswählen

df.to_datetime(df['Date'])
umwandeln

https://pandas.pydata.org/docs/referenc ... o_datetime
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Oder eben gleich beim Reinladen in datetime umwandeln lassen.
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

derElch hat geschrieben: Dienstag 8. März 2022, 12:31 Die betreffende Spalte mit:

Code: Alles auswählen

df.to_datetime(df['Date'])
umwandeln

https://pandas.pydata.org/docs/referenc ... o_datetime

Code: Alles auswählen

'DataFrame' object has no attribute 'to_datetime'
Vermute auch mal, daß Dein Vorschlag so nicht geht. Ich sehe in der Dokumentation von pandas.to_datetime() nichts von
einem Timestampformat wie ISO8061.
--
Grüße
Christoph
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

Meine Lösung sieht jetzt so aus:

Code: Alles auswählen

import numpy as np
import pandas as pd
import dateutil.parser as dp




def delta_t(t,t0):
    parsed_t = dp.parse(t)
    return parsed_t.timestamp()-t0

def iso8601_t(t):
    parsed_t = dp.parse(t)
    return parsed_t.timestamp()

data= {
        "DATE": ["2022-02-24T14:09:07.000Z",
                 "2022-02-24T14:09:08.000Z",
                 "2022-02-24T14:09:09.000Z",
                 "2022-02-24T14:09:10.000Z"],
        "LAT": [52.8464488,
                52.8464512,
                52.8464556,
                52.8464613,],
        "LON": [14.2807312,
                14.280736,
                14.2807427,
                14.2807463],
        "NN": [516.521,
               516.537,
               516.398,
               516.58]
      }

df = pd.DataFrame(data)

print("Zahl der ROWS in df:",len(df.index))
print()
#print(df.info()) 
#print(df.loc[:,'LAT'])
#output_list = list(map(double, integer_list))
at=np.array(df.loc[:,'DATE'].tolist())

t=at[0]
print("\nErstes DATE Element:",t)
pt=list(at)
parsed_t = dp.parse(t)
T0 = parsed_t.timestamp()
print("         in seconds:",t_in_seconds)
at0=np.empty(len(df.index), dtype = float)

at0.fill(T0)
np.set_printoptions(formatter={'float': '{: 0.9f}'.format})
# array mit T0
print (at0)
# array mit den Original ISO8601 Timestamps aus dem DataFrame
print (at)
# noch mal als Liste
print(pt)
# Leider müssen mehrfache Map-Functionparameter iterierbar sein, deshalb 2. Array mit T0
t1=list(map(delta_t,pt,at0))
# delta sec
print("-----------------Delta Sekunden---------------")
print(t1)
# ISO8601 in absolute sec 
t2=list(map(iso8601_t,at))
print("---------------Absolute Sekunden--------------")
print(t2)

Zuletzt geändert von Krischu am Dienstag 8. März 2022, 16:26, insgesamt 1-mal geändert.
--
Grüße
Christoph
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt hier Vermutungen zu äußern, könntest Du es auch einfach testen.
Ein Dateframe zu einer Liste zu einem Numpy-Array zu konvertieren, dann das ganze wieder in eine Liste um diese dann mit map zu konvertieren ist doch reichlich umständlich.

Code: Alles auswählen

date = pd.to_datetime(df['DATE'])
seconds = date.astype(int) / 1e9
delta_seconds = seconds - seconds[0]
Krischu
User
Beiträge: 87
Registriert: Dienstag 14. Januar 2014, 09:07

Danke. Hat geklappt. Elegant.
--
Grüße
Christoph
Antworten