-
-
Save dj1711572002/4a826a4706b18ea091faafc51ccd72f4 to your computer and use it in GitHub Desktop.
Python DataFrame Insert rows HighSpeed
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is a sample Python script. | |
# 機能:STA24 SystemのログデータをCSV形式で読み込んで、データの検査と修復をおこなって各デバイス間の同期を整頓する | |
# iTOW抜け:ループで回して、発見したら補間した行を作って、DFの再下端に追加していく、全部ループが終了したらiTOWをSORTして整頓 | |
# | |
import pandas as pd | |
import tkinter | |
import tkinter.filedialog as FileDialog | |
import os | |
import numpy as np | |
import pickle | |
def is_num(x):#数値か文字かを判別する関数 | |
try: | |
float(x) | |
except ValueError: | |
return False | |
else: | |
return True | |
def main(): | |
# id+PVT33+RELPOSNED 20 | |
#--------------------------------------------MBUX FILES----------------------------------------------------------------- | |
#UBXデータは、BaseとRoverから同形式で出力されたバイナリーをSTA24システムでUBX値に変換してCSVファイル | |
#形式は、Baseは、id列に’B'行で Roverはid列に’R'行がついている。同じitowが2行となる。 | |
#PVT33個 RELPOSNED 20個 計55個x2=110個整数 | |
list_PVT = ["id", "iTOW", "year", "month", "day", "hour", "min", "sec", "valid", "tAcc", "nano", "fixtye", "flags", | |
"flags2", "numSV", "lon", "lat", "height", "hMSL", | |
"hAcc", "vAcc", "velN", "velE", "velD", "gSpeed", "headMot", "sAcc", "headAcc", "pDOP", "flags3", | |
"reserved1", "headVeh", "magDec", "magAcc", ""] # 33 | |
list_BasePVT = [s + '_B' for s in list_PVT] | |
list_RoverPVT = [s + '_R' for s in list_PVT] | |
list_RELP = ["version", "reserved2", "refStationId", "iTOWR", "relPosN", "relPosE", "relPosD", "relPosLength", | |
"relPosHeading", "relPosHPN", | |
"relPosHPE", "relPosHPD", "relPosHPLength", "accN", "accE", "accD", "accLength", "accHeading", | |
"reserverd4", "flagsR", "a"] | |
list_BaseRELP = [s + '_B' for s in list_RELP] | |
list_RoverRELP = [s + '_R' for s in list_RELP] | |
# print(list_BasePVT) | |
# print(list_RoverPVT) | |
#--------------------------------------------MovingBase BNO FILES----------------- | |
list_BNO=["bnitow","yaw","pitch","roll","ax","ay","az","com1","com2","com3"] | |
root = tkinter.Tk() | |
root.withdraw() | |
iDir = r'C:/RTK_Log/' | |
fTyp = [("データファイル", "*.csv;*.xlsx;*.xls"), ("すべてのファイル", "*.*")] | |
filename = FileDialog.askopenfilename(parent=root, initialdir=iDir, filetypes=fTyp) | |
# filenameからbasenameをとりだしてファイル種類区別 | |
basename = os.path.basename(filename) | |
if "ubx" in basename: | |
head0 = list_PVT + list_RELP | |
df = pd.read_csv(filename, names=head0, low_memory=True)#CSV Read dfに読み込まれる head0の列名がつく | |
print("PATH:", filename, "READ:", basename)#basenameは、パスをのぞいたファイル名 ファイル名ubx とbnoで処理分ける | |
pd.set_option('display.max_columns', 120) #120列まで表示 | |
df_Base = df[df.iloc[:, 0] == 'B']#id列[:,0]が'B'ならばdf_Baseとして抽出 | |
df_Base = df_Base.fillna(0)#NANをゼロに変換 | |
df_Base = df_Base.reset_index()#index番号リセット | |
df_Base = df_Base.add_suffix('_B', axis=1)#head0の名称末尾に'_B'をつけてBaseのデータ列命名 | |
df_Base = df_Base.drop(columns='index_B')#index_Bは不要なので消去 | |
df_Base=df_Base.drop(columns='id_B')#id_Bも不要なので消去 数値以外のデータ除去 | |
headB=df_Base.columns#完成したヘッダ文字LISTを保持 | |
print("headB=",headB) | |
k=[]# itow エラー list k[]宣言 | |
#------------df_Baseをlistへ読み出し----------- | |
list_data=[]# df_Baseの値をlistに読み込む DFでの処理よりlistで処理したほうが速い | |
list_data = df_Base.to_numpy().tolist()# list_dataに値を代入 | |
#print("list_data=",list_data) | |
print("list_data size=",[len(v) for v in list_data])# | |
#----------------------------------------- | |
lbase=len(df_Base)#全行数 | |
#lastrow = len(df_Base) | |
for i in range(1,lbase):#行数ループ 整数iでカウント | |
#print("range i=",i) | |
if i>1:#i-1対策 | |
itow0=(int)(df_Base.iloc[i,0])#整数で番地指定しているのでiloc使用 | |
itow_1 = (int)(df_Base.iloc[i-1, 0])#1個手前のitow_1 | |
#print(itow0-itow_1) | |
c=[]#補間計算データ行リスト | |
k=0 | |
if itow0-itow_1>120 :#itow差が120以上あったらエラー | |
itowadd=itow_1+120 | |
print("itowadd=",itowadd,"itow0=",itow0,"itow_1=",itow_1) | |
for j in range(0,55):#列をループして平均値計算 | |
ss=df_Base.iloc[i,j] | |
#if is_num(ss): | |
a=float(df_Base.iloc[i,j]) | |
b = float(df_Base.iloc[i-1, j]) | |
#print(j,a,b) | |
c.append(int((a+b)/2))#補間行リストに平均値代入 | |
#add c to list_data | |
list_data.append(c)#行代入が完了したcをlist_dataに追加 元のlistデータの最高単に追加される | |
#print("c len=",len(c)) | |
#print("Err made c=",c) | |
#print("list_data size=", [len(v) for v in list_data]) | |
#================All list_data をdf_Base2にしてitow SORTして修正完成===================================== | |
df_Base2 = pd.DataFrame(list_data, columns=headB)#i,jでループ完了したら、list_dataから新たなDF df_Base2を作成 | |
# 数値以外のデータが含まれている行の抽出 | |
non_numeric_rows = df_Base2.apply(lambda x: not pd.to_numeric(x, errors='coerce').notnull().all(), axis=1) | |
#print("nonnumericRow=",non_numeric_rows) | |
# 数値以外のデータが含まれている列の抽出 | |
non_numeric_cols = df_Base2.apply(lambda x: not pd.to_numeric(x, errors='coerce').notnull().all()) | |
#print("nonnumericCol=",non_numeric_cols) | |
#df_Rover2 = df_Base2.fillna(0) | |
#df_Base2['iTOWB']=df_Base2['iTOW_B'].astype('int') | |
#-------------------iTOW_BでSORTする前にiTOW_Bのゴミを完全に排除する-------------------------------------- | |
df_Base2['iTOW_B'] = df_Base2['iTOW_B'].astype('str') | |
df_Base2['iTOW_B'] = df_Base2['iTOW_B'].str.replace('-', '').str.replace(':', '').str.replace(' ', '') | |
df_Base2['iTOW_B'] = df_Base2['iTOW_B'].astype(int) | |
#---------------------------------------------------------------------------------------------------- | |
print(df_Base2) | |
df_Base2.info() | |
#pd.set_option('display.max_rows', None) | |
df_Base2=df_Base2.sort_values("iTOW_B",ascending = True)# SORT iTOWBでSORT | |
print("Sorted df_Base2=",df_Base2) | |
#----------CHECK SORT-------------- | |
itowerr=0 | |
for i in range(1,len(df_Base2)-1): | |
itow0=df_Base2.iloc[i+1,0] | |
itow_1=df_Base2.iloc[i,0] | |
if((itow0-itow_1)!=120): | |
itowerr+=1 | |
print("***********i=",i,itow0,"itowErr=",itowerr) | |
#============================BASE ITOW 補修終了=============================== | |
#========================ROVER iTOW処理====================================== | |
#df_Base2.info() | |
#df_Rover = df[df.iloc[:, 0] == 'R'] | |
#df_Rover.reset_index(drop=True, inplace=True) | |
#df_Rover = df_Rover.add_suffix('_R', axis=1) | |
df_Rover = df[df.iloc[:, 0] == 'R'] # id列[:,0]が'B'ならばdf_Baseとして抽出 | |
df_Rover = df_Rover.fillna(0) # NANをゼロに変換 | |
df_Rover = df_Rover.reset_index() # index番号リセット | |
df_Rover = df_Rover.add_suffix('_R', axis=1) # head0の名称末尾に'_B'をつけてBaseのデータ列命名 | |
df_Rover = df_Rover.drop(columns='index_R') # index_Bは不要なので消去 | |
df_Rover = df_Rover.drop(columns='id_R') # id_Bも不要なので消去 数値以外のデータ除去 | |
headR = df_Rover.columns # 完成したヘッダ文字LISTを保持 | |
print("headR=", headR) | |
print(df_Rover) | |
kr = [] # itow エラー list kr[]宣言 | |
# ------------df_Roverをlistへ読み出し----------- | |
list_datar = [] # df_Baseの値をlistに読み込む DFでの処理よりlistで処理したほうが速い | |
list_datar = df_Rover.to_numpy().tolist() # list_datarに値を代入 | |
# print("list_datar=",list_datar) | |
print("list_datar size=", [len(v) for v in list_datar]) # | |
# ----------------------------------------- | |
lbaser = len(df_Rover) # 全行 | |
for i in range(1, lbaser): # 行数ループ 整数iでカウント | |
# print("range i=",i) | |
if i > 1: # i-1対策 | |
itow0 = (int)(df_Rover.iloc[i, 0]) # 整数で番地指定しているのでiloc使用 | |
itow_1 = (int)(df_Rover.iloc[i - 1, 0]) # 1個手前のitow_1 | |
# print(itow0-itow_1) | |
cr = [] # 補間計算データ行リスト | |
kr = 0 | |
if itow0 - itow_1 > 120: # itow差が120以上あったらエラー | |
itowadd = itow_1 + 120 | |
print("itowadd=", itowadd, "itow0=", itow0, "itow_1=", itow_1) | |
for j in range(0, 55): # 列をループして平均値計算 | |
ss = df_Base.iloc[i, j] | |
# if is_num(ss): | |
a = float(df_Base.iloc[i, j]) | |
b = float(df_Base.iloc[i - 1, j]) | |
#print(j,a,b) | |
cr.append(int((a + b) / 2)) # 補間行リストに平均値代入 | |
# add c to list_data | |
list_datar.append(cr) # 行代入が完了したcをlist_dataに追加 元のlistデータの最高単に追加される | |
# print("cr len=",len(cr)) | |
# print("Err made cr=",cr) | |
# print("list_datar size=", [len(v) for v in list_datar]) | |
# ================All list_data をdf_Base2にしてitow SORTして修正完成===================================== | |
df_Rover2 = pd.DataFrame(list_datar, columns=headR) # i,jでループ完了したら、list_dataから新たなDF df_Base2を作成 | |
# 数値以外のデータが含まれている行の抽出 | |
non_numeric_rows = df_Rover2.apply(lambda x: not pd.to_numeric(x, errors='coerce').notnull().all(), axis=1) | |
print("nonnumericRow=",non_numeric_rows) | |
# 数値以外のデータが含まれている列の抽出 | |
non_numeric_cols = df_Rover2.apply(lambda x: not pd.to_numeric(x, errors='coerce').notnull().all()) | |
print("nonnumericCol=",non_numeric_cols) | |
df_Rover2 = df_Rover2.fillna(0) | |
# df_Rover2['iTOW_R']=df_Rover2['iTOW_R'].astype('int') | |
# -------------------iTOW_BでSORTする前にiTOW_Bのゴミを完全に排除する-------------------------------------- | |
df_Rover2['iTOW_R'] = df_Rover2['iTOW_R'].astype('str') | |
df_Rover2['iTOW_R'] = df_Rover2['iTOW_R'].str.replace('-', '').str.replace(':', '').str.replace(' ', '') | |
df_Rover2['iTOW_R'] = df_Rover2['iTOW_R'].astype(int) | |
# ---------------------------------------------------------------------------------------------------- | |
print(df_Rover2) | |
df_Rover2.info() | |
# pd.set_option('display.max_rows', None) | |
df_Rover2 = df_Rover2.sort_values("iTOW_R",ascending=True) # SORT iTOW_RでSORT | |
print("Sorted df_Rover2=", df_Rover2) | |
# ----------CHECK SORT-------------- | |
itowerr = 0 | |
for i in range(1, len(df_Rover2) - 1): | |
itow0 = df_Rover2.iloc[i + 1, 0] | |
itow_1 = df_Rover2.iloc[i, 0] | |
if ((itow0 - itow_1) != 120): | |
itowerr += 1 | |
print("***********i=", i, itow0, "itowErr=", itowerr,"sa=",itow0-itow_1) | |
# ============================Rover ITOW 補修終了=============================== | |
print("--------------------CONCAT---------------------") | |
result = pd.concat([df_Base, df_Rover], axis=1) | |
result.reset_index() | |
result.to_csv(r'C:/RTK_Log/BR_' + basename) | |
print(result) | |
elif "bno" in basename: | |
head0=list_BNO | |
df = pd.read_csv(filename, names=head0, low_memory=True) | |
print("PATH:", filename, "READ:", basename) | |
pd.set_option('display.max_columns', 40) | |
df.to_csv(r'C:/RTK_Log/BNO_' + basename) | |
# 最後に呼び出す | |
main() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment