Skip to content

Instantly share code, notes, and snippets.

@dj1711572002
Created March 17, 2024 12:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dj1711572002/4a826a4706b18ea091faafc51ccd72f4 to your computer and use it in GitHub Desktop.
Save dj1711572002/4a826a4706b18ea091faafc51ccd72f4 to your computer and use it in GitHub Desktop.
Python DataFrame Insert rows HighSpeed
# 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