Zeitumrechnungen in Pandas
tldr; Wie konvertiere ich DateTimeIndex zurück in eine Spalte in einem Datenrahmen?
Die lange Erklärung:
Ich habe Beschleunigungsmesser- und Wägezellendaten für denselben Zeitraum, aber die Zeitstempel für jedes Gerät liegen in unterschiedlichen Formaten und Zeitzonen vor. Meine derzeitige Theorie besagt, dass sie dasselbe Format haben müssen, damit ich beide Datensätze in einem Datenrahmen zusammenführen kann.
Mein erster Schritt war, diesen Prozess durch korrektes Einlesen der Daten so weit wie möglich zu beschleunigen. Zu diesem Zweck habe ich die Datums- und Zeitdaten für die Ladedaten kombiniert und diese Spalte in "Uhrzeit" umbenannt, sodass sie mit den Beschleunigungsmesserdaten übereinstimmt.
import pandas as pd
import datetime as dt
path = r"C:\Users\afhal\Dropbox\Arboriculture\ThesisData\Kane_Shared_Folder\2020Summer"
load_path = path + "\\" + r"ulmus15\Reference\ulmus15loads.csv"
pull_path = path + "\\"+ r"ulmus15\Reference\ulmus15pulls.csv"
df_pull = pd.read_csv(pull_path, skiprows =22, parse_dates = ["Time"])
print(df_pull)
df_load = pd.read_csv(load_path, parse_dates = [["Date","Time"]])
df_load = df_load.rename(columns = {"Date_Time": "Time", "Elapsed mS": "Elapsed S", "Climber": "Load"})
print(df_load)
Ergebnisse für Beschleunigungsmesserdaten
Time 12159:ch4 12159:ch5 12160:ch4 12160:ch5 <br>
0 2020-07-25 13:20:46 52.56000 -27.23 73.34 8.86
1 2020-07-25 13:20:47 52.18000 -27.04 73.02 8.99
2 2020-07-25 13:20:48 52.18000 -27.03 73.02 8.98
3 2020 -07-25 13:20:49 52.35000 -27.47 73.04 8.97
4 2020-07-25 13:20:50 52.31000 -26.84 73.03 8.98
... ... ... ... ...
9266 2020 -07-26 11:22:49 81.07000 0.19 80.64 -0.32 9267
2020-07-26 11:22:50 81.75999 -0.08 80.63 -0.32
9268 2020-07-26 11:22:51 81.06000 0.18 80.63 -0.32
9269 2020- 07-26 11:22:52 81.77000 -0.08 80.64 -0.31 9270
2020-07-26 11:22:53 NaN NaN 80.64 -0.31
[9271 Zeilen x 5 Spalten]
Ergebnisse für Wägezellendaten
Time Elapsed S Load
0 2020-07-25 09:26:28 1002 2
1 2020-07-25 09:26:29 2011 2
2 2020-07-25 09:26:30 3035 3
3 2020-07-25 09:26:31 4037 2
4 2020-07-25 09:26:32 5060 2
... ... ... ...
1302 2020-07-25 09:48:24 1317109 -2
1303 2020-07-25 09:48 : 25 1318135 -2
1304 2020-07-25 09:48:26 1319165 -1
1305 2020-07-25 09:48:27 1320177 -2
1306 2020-07-25 09:48:28 1321178 -1
[1307 Zeilen x 3 Spalten]
Ich musste die Beschleunigungsmesserdaten in US / Eastern konvertieren. Mein Verständnis beim Lesen anderer StackOverflow-Fragen ist, dass ich meine Zeitspalte von einem Pandas DateTime in einen Pandas DateTimeIndex ändern muss. Ich habe dies mit dem folgenden Code erreicht:
df_test = df_pull.set_index('Time').index.astype('datetime64[ns]')
df_test.tz_localize('UTC').tz_convert('US/Eastern')
Und das hat mich gründlich ins Unkraut gebracht.
- Problem 1: Ich habe anscheinend meine anderen Spalten beim Erstellen eines DateTimeIndex zerstört - wie bekomme ich sie zurück?
- Problem 2: Ein DateTimeIndex ist nicht dasselbe wie ein DateTime-Objekt, und ich glaube nicht, dass ich sie zusammenführen kann, es sei denn, ich mache den DateTimeIndex wieder zu einem DateTime-Objekt.
Antworten
Nachdem ich viel im Internet herumgespielt hatte, löste ich mein Problem!
# CREATE a DateTimeIndex
pull_index = df_pull.set_index('Time').index.astype('datetime64[ns]')
# Localize time with tz
pull_index = pull_index.tz_localize('UTC').tz_convert('US/Eastern')
# Back to an naive datetimeindex! https://stackoverflow.com/questions/36292959/pandas-merge-data-frames-on-datetime-index
pull_index = pull_index.tz_localize(None)
print(pull_index)
# Create a datetimeindex for the other dataset
load_index = df_load.set_index('Time').index.astype('datetime64[ns]')
print(load_index)
# Add datetimeindex to datasets and delete extra columns
df_pull=df_pull.set_index(pull_index)
df_pull.drop("Time",axis=1,inplace=True)
print(df_pull)
df_load=df_load.set_index(load_index)
df_load.drop("Time",axis=1,inplace=True)
print(df_load)
# Merge by datetimeindex
merge=pd.merge(df_pull,df_load, how='inner', left_index=True, right_index=True)