Seite 1 von 1

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

Verfasst: Dienstag 8. März 2022, 12:24
von Krischu
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)



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

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

Code: Alles auswählen

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

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

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

Verfasst: Dienstag 8. März 2022, 13:31
von Sirius3
Oder eben gleich beim Reinladen in datetime umwandeln lassen.

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

Verfasst: Dienstag 8. März 2022, 14:20
von Krischu
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.

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

Verfasst: Dienstag 8. März 2022, 15:58
von Krischu
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)


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

Verfasst: Dienstag 8. März 2022, 16:19
von Sirius3
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]

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

Verfasst: Dienstag 8. März 2022, 21:00
von Krischu
Danke. Hat geklappt. Elegant.