Konwersje czasu w pandach

Dec 06 2020

tldr; Jak przekonwertować DateTimeIndex z powrotem na kolumnę w ramce danych?

Długie wyjaśnienie:

Mam dane akcelerometru i komórki ładującej z tego samego okresu, ale sygnatury czasowe dla każdego urządzenia są w różnych formatach i strefach czasowych. Moja obecna teoria jest taka, że ​​potrzebuję ich w tym samym formacie, aby móc scalić oba zestawy danych w jedną ramkę danych.

Moim pierwszym krokiem było przyspieszenie tego procesu w jak największym stopniu poprzez poprawny odczyt danych. W tym celu połączyłem dane daty i godziny dla Załaduj dane i zmieniłem nazwę tej kolumny na „Czas”, aby była taka sama jak dane z akcelerometru.

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)

Wyniki dla danych akcelerometru

              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 wierszy x 5 kolumn]

Wyniki dla danych komórki obciążeniowej

    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 wierszy x 3 kolumny]

Musiałem przekonwertować dane akcelerometru na amerykański / wschodni. Z czytania innych pytań dotyczących StackOverflow rozumiem, że muszę zmienić kolumnę czasu z pandy DateTime na pandę DateTimeIndex. Osiągnąłem to za pomocą następującego kodu:

df_test = df_pull.set_index('Time').index.astype('datetime64[ns]')
df_test.tz_localize('UTC').tz_convert('US/Eastern')

I to wprawiło mnie całkowicie w chwasty.

  • Problem 1: Wygląda na to, że podczas tworzenia DateTimeIndex zniszczyłem inne kolumny - jak je odzyskać?
  • Problem 2: DateTimeIndex nie jest tym samym, co obiekt DateTime i nie sądzę, żebym mógł je scalić, chyba że przekształcę DateTimeIndex z powrotem w obiekt DateTime.

Odpowiedzi

1 AHalperin Dec 07 2020 at 16:06

Po wielu zamieszaniu w Internecie rozwiązałem swój 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)