У меня есть файл журнала с устройства с некоторой информацией для анализа, и я использую Pandas и Python для чтения этого файла для некоторых целей анализа. Итак, давайте предположим, что ниже приведено содержимое файла.
20:03:42.769 0xAA 0x99->0x98 A200000000000000000088DD
20:03:42.769 0x11 0x00->0x00 B2
20:03:42.815 0xAA 0x98->0x99 5203001C0C1C0C0E0E
20:03:42.831 0x11 0x00->0x00 EE
20:03:50.726 0xAA 0x99->0x98 A200000000000000000088DD
20:03:50.819 0xAA 0x99->0x98 A200000000000000000088DD
20:03:50.895 0xAA 0x99->0x98 A200000000000000000088DD
20:03:54.841 0xAA 0x98->0x99 1202
20:03:54.857 0x11 0x00->0x00 E0
20:03:54.935 0xAA 0x99->0x98 120300410102000C070A00
20:03:54.935 0x11 0x00->0x00 AB
20:03:55.013 0xAA 0x99->0x98 120301050000050C000003
И я хочу разделить информацию на отдельные столбцы, как показано ниже.
20:03:42.769 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:42.769 0x11 0x00->0x00 B2
20:03:42.815 0xAA 0x98->0x99 52 03 00 1C 0C 1C 0C 0E 0E
20:03:42.831 0x11 0x00->0x00 EE
20:03:50.726 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:50.819 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:50.895 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:54.841 0xAA 0x98->0x99 12 02
20:03:54.857 0x11 0x00->0x00 E0
20:03:54.935 0xAA 0x99->0x98 12 03 00 41 01 02 00 0C 07 0A 00
20:03:54.935 0x11 0x00->0x00 AB
20:03:55.013 0xAA 0x99->0x98 12 03 01 05 00 00 05 0C 00 00 03
С помощью pd.read_csv я могу разделить данные, но как разделить последний столбец на фиксированную ширину с 2 символами в каждом столбце, то же самое происходит с pd.read_fwf
Time Header Src->Dest Data
0 20:03:42.769 0xAA 0x99->0x98 A200000000000000000088DD
1 20:03:42.769 0x11 0x00->0x00 B2
2 20:03:42.815 0xAA 0x98->0x99 5203001C0C1C0C0E0E
3 20:03:42.831 0x11 0x00->0x00 EE
4 20:03:50.726 0xAA 0x99->0x98 A200000000000000000088DD
Проблема заключается в том, как разделить данные последнего столбца на 2 символа в каждом столбце.
Я тоже пытался это сделать.
colspecs = [ (0,12), (13,17), (18,28), (29,31), (31,33) ]
df = pd.read_fwf("SampleLog.txt", colspecs = colspecs, names=["Time", "Header", "Src->Dest", "C1", "C2"])
И я понимаю это.
Time Header Src->Dest C1 C2
0 20:03:42.769 0xAA 0x99->0x98 A2 0.0
1 20:03:42.769 0x11 0x00->0x00 B2 NaN
2 20:03:42.815 0xAA 0x98->0x99 52 3.0
3 20:03:42.831 0x11 0x00->0x00 EE NaN
4 20:03:50.726 0xAA 0x99->0x98 A2 0.0
Здесь похоже, что это сработает, но проблема в том, что я получаю значения с плавающей запятой в столбце «C2», и я также получу такое же поведение в других столбцах, если добавлю. Причина такого поведения связана с «NaN», который преобразует полный столбец в тип float/double. Я попытался заменить «NaN» на что-то другое, но не смог его использовать. Может ли кто-нибудь помочь мне в решении этой проблемы, с которой я столкнулся?
Вы можете попробовать угадать по умолчанию и проанализировать данные:
df = pd.read_fwf('a.csv', names=["Time", "Header", "Src->Dest", "C1"])
(df.drop('C1', axis=1)
.join(df['C1'].str.extractall('(.{2})')[0].unstack('match'))
)
Выход:
Time Header Src->Dest 0 1 2 3 4 5 6 7 8 9 10 11
0 20:03:42.769 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
1 20:03:42.769 0x11 0x00->0x00 B2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 20:03:42.815 0xAA 0x98->0x99 52 03 00 1C 0C 1C 0C 0E 0E NaN NaN NaN
3 20:03:42.831 0x11 0x00->0x00 EE NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 20:03:50.726 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
5 20:03:50.819 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
6 20:03:50.895 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
7 20:03:54.841 0xAA 0x98->0x99 12 02 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 20:03:54.857 0x11 0x00->0x00 E0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9 20:03:54.935 0xAA 0x99->0x98 12 03 00 41 01 02 00 0C 07 0A 00 NaN
10 20:03:54.935 0x11 0x00->0x00 AB NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
11 20:03:55.013 0xAA 0x99->0x98 12 03 01 05 00 00 05 0C 00 00 03 NaN