>source

압력 스캐너는 다음 형식의 이진 데이터 파일을 출력합니다

이진 파일 형식의 사용자 설명서를 정리하십시오 :

모든 열이 별도의 열에 있고 온도 및 압력 배열이 별도의 열에 풀린 팬더 데이터 프레임을 만들고 싶습니다.

의상 바이너리 파일 읽기에 익숙하지 않아서 도움을 사용할 수 있습니다.

안부를 전하며 1 월


  • 답변 # 1

    여기에 방법을 보여주는 해결책이 있습니다. 나는 단지 하나의 레코드 만 읽고 있으며 모든 열 (긴 길이)을 구현하지 않았습니다. 누락 된 열을 추가하기 만하면됩니다. 그래서 다른 열의 온도와 압력을 폭발 시켰습니다. 루프를 읽으십시오.

    라이브러리 비트 스트링을 사용하는 마지막 것은, 이진 읽기를 단순화하고 여기에서 파일 형식이이 형식이기 때문에 빅 엔디안을 사용하고 있습니다

    일부 판독 비트 열

    import pandas as pd
    from  bitstring import ConstBitStream
    #creating columns names
    columnNames = ['pType', 'pSize', 'fNumber', 'scT', 'unitconv', 'exTrigger']
    for i in range(8):
        columnNames.append('Temp' + str(i+1))
    for i in range(64):
        columnNames.append('Pressure' + str(i+1))
    columnNames.append('fTime_sec');columnNames.append('fTime_nano')
    df = pd.DataFrame(columns=columnNames)
    print(df)
    s = ConstBitStream(filename='e:\\+poub\\test.pdf')
    index = 0
    #you could do a loop if more records in file
    #read file bytes and put in the equivalent column of dataframe
    df.at[index, 'pType']=  s.read(4 * 8).intbe      #read 4 bytes int big endian
    df.at[index, 'pSize'] = s.read(4 * 8).intbe      #again
    df.at[index, 'fNumber'] = s.read(4 * 8).intbe
    df.at[index, 'scT'] = s.read(4 * 8).intbe
    df.at[index, 'unitconv'] = s.read(4 * 8).intbe
    df.at[index, 'exTrigger'] = s.read(4 * 8).uintbe #read uint big endian
    #read 8 temp of 4 bytes in floatb be
    for i in range(8):   
        df.at[index, 'Temp' + str(i+1)] = s.read(4 * 8).floatbe
    #read 64 pressure of 4 bytes in floatbe
    for i in range(64):
        df.at[index, 'Pressure' + str(i+1)]= s.read(4 * 8).floatbe
    df.at[index, 'fTime_sec'] = s.read(4 * 8).intbe
    df.at[index, 'fTime_nano'] = s.read(4 * 8).intbe
    print(df)
    
    

  • 답변 # 2

    프랑스 인이 제안한 방법은 효과가 있었지만 우리가 수행 한 기록의 수는 충분히 빠르지 않았습니다. 최종 코드는 훨씬 빠릅니다 :

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    # Create a data type with the binary data format and desired column names
    dataType = [
          ('pType', 'i4'),
          ('pSize', 'i4'),
          ('frNumber','i4'),
          ('scType', 'i4'),
          ('frRate', 'f4'),
          ('vStatus', 'i4'),
          ('unitsIndex', 'i4'),
          ('unitConvFactor', 'i4'),
          ('ptpScanStart_sec', 'i4'),
          ('ptpScanStart_nsec', 'i4'),
          ('exTrigger_usec', 'u4')
          ]
    # add the 8 temperatures to datatype
    for i in range(8):
        dataType.append(('T'+str(i), 'f4'))
    # add the 64  pressures to datatype
    for i in range(64):
        dataType.append(('P'+str(i), 'f4'))
    # append last items to data type
    dataType.append(('frTime_sec', 'i4'))
    dataType.append(('frTime_nsec', 'i4'))
    dataType.append(('exTrigger_sec', 'i4'))
    dataType.append(('exTrigger_nsec', 'i4'))    
    dt= np.dtype(dataType)
    # read data 
    pd.DataFrame.from_records(np.fromfile('./data/700hz_180sec.dat', dtype=dt))
    
    

  • 이전 email - '암호는 8 자 이상이어야하고 확인과 일치해야합니다'오류 해결 방법 라 라벨 58
  • 다음 python - 배열에서 의도 한대로 추가 작업을하려면 어떻게해야합니까?