2017-12-13 1 views
0

Die Art der Daten, die wir streamen, stammt aus unserem PI System, das Daten unregelmäßig ausgibt. Dies ist bei Zeitreihendaten nicht ungewöhnlich, daher habe ich versucht, jedem Zeitstempel eine Sekunde hinzuzufügen, um sicherzustellen, dass der Index eindeutig ist. Dies hat jedoch nicht so funktioniert, wie ich gehofft habe, da ich einen Typfehler erhalten habe.So passen Sie Zeitstempel für Streamingdaten richtig an, um eindeutige Indizes zu erstellen

Ich habe versucht, die in (Modifying timestamps in pandas to make index unique) hervorgehobenen Lösungen jedoch ohne Erfolg zu implementieren.

Die Fehlermeldung ich erhalte, ist:

TypeError: ufunc add cannot use operands with types dtype('O') and dtype('<m8') 

Die Code-Implementierung unter:

values = Slugging_Sep.index.duplicated(keep=False).astype(float) 
values[values==0] = np.NaN 

missings = np.isnan(values) 
cumsum = np.cumsum(~missings) 
diff = np.diff(np.concatenate(([0.], cumsum[missings]))) 
values[missings] = -diff 

# print result 
result = Slugging_Sep.index + np.cumsum(values).astype(np.timedelta64) 
print(result) 

Was ich

  • Type Casting versucht haben - ich dachte, dass die Die Berechnung erfolgte aufgrund von zwei unterschiedlichen Typen ther, aber dies hat das Problem nicht gelöst.
  • Zeit Delta in Pandas verwenden - Dies erzeugt den gleichen Typ Fehler.

    pd.to_timedelta(Slugging_Sep.groupby('Time').cumcount(), unit='ms')) 
    Slugging_Sep['Time'] = (str(Slugging_Sep['Time'] + 
    pd.to_timedelta(Slugging_Sep.groupby('Time').cumcount(), unit='ms'))) 
    

So habe ich zwei Fragen daraus:

  1. Könnte jemand einen Rat für mich sorgen darüber, wie diese für zukünftige Zeitreihen Probleme zu lösen?
  2. Was ist eigentlich dtype ('<m8')

Danke.

Irregular Data Example

+0

Können Sie Beispieleingabe und beabsichtigte Ausgabe für einige Testfälle bereitstellen? Vermeiden Sie es auch, Screenshots von Daten zu veröffentlichen - geben Sie stattdessen die eigentlichen Daten inline ein. Es ist viel einfacher, auf diese Weise zu helfen. –

+1

Meine beste Vermutung ist, dass Slugging_Sep.index keine richtige Datetime ist. Haben Sie versucht, es mit pd.to_datetime() zu konvertieren, bevor Sie das Timedelta hinzufügen? –

Antwort

0

Alex Zisman Vorschlag verwenden, rückverwandelt ich die Slugging_Sep.index über die folgende Zeile ein:

pd.to_datetime(Slugging_Sep['Time']) 
Slugging_Sep.set_index('Time', inplace=True) 

ich dann den folgenden Code aus dem obigen SO genommen implementiert verknüpfe ich erwähnt:

#values = Slugging_Sep.index.duplicated(keep=False).astype(float) 
#values[values==0] = np.NaN 

#missings = np.isnan(values) 
#cumsum = np.cumsum(~missings) 
#diff = np.diff(np.concatenate(([0.], cumsum[missings]))) 
#values[missings] = -diff 

# print result 
#result = Slugging_Sep.index + np.cumsum(values).astype(np.timedelta64()) 
#Slugging_Sep.index = result 
#print(Slugging_Sep.index) 

Dies löste das Problem und fügte jedem doppelten Zeitstempel Nanosekunden hinzu, so dass es zu einem eindeutigen Index wurde.

Verwandte Themen