Konversi Waktu di panda
tldr; Bagaimana cara mengubah DateTimeIndex kembali ke kolom dalam kerangka data?
Penjelasan panjangnya:
Saya memiliki data akselerometer dan loadcell untuk periode waktu yang sama, tetapi stempel waktu untuk setiap perangkat memiliki format dan zona waktu yang berbeda. Teori saya saat ini adalah bahwa saya membutuhkannya dalam format yang sama sehingga saya dapat menggabungkan kedua kumpulan data menjadi satu kerangka data.
Langkah pertama saya adalah mempercepat proses ini sebanyak mungkin dengan membaca data dengan benar. Untuk itu, saya menggabungkan data tanggal dan waktu untuk Memuat Data dan mengganti nama kolom itu menjadi "Waktu" sehingga akan sama dengan data Akselerometer.
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)
Hasil untuk Data Akselerometer
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 baris x 5 kolom]
Hasil untuk Load Cell Data
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 baris x 3 kolom]
Saya perlu mengonversi Data Akselerometer ke AS / Timur. Pemahaman saya dari membaca pertanyaan StackOverflow lainnya adalah bahwa saya perlu mengubah kolom waktu saya dari DateTime panda menjadi DateTimeIndex panda. Saya menyelesaikan ini dengan kode berikut:
df_test = df_pull.set_index('Time').index.astype('datetime64[ns]')
df_test.tz_localize('UTC').tz_convert('US/Eastern')
Dan ini telah membuat saya benar-benar dalam gulma.
- Masalah 1: Sepertinya saya telah menghancurkan kolom saya yang lain dalam proses membuat DateTimeIndex - bagaimana cara mendapatkannya kembali?
- Masalah 2: DateTimeIndex tidak sama dengan objek DateTime, dan saya rasa saya tidak dapat menggabungkannya kecuali saya membuat DateTimeIndex kembali menjadi objek DateTime.
Jawaban
Setelah banyak ribut-ribut di Internet, saya memecahkan masalah saya!
# 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)