Спасибо за ответы, я немного коснулся прошлой ночи, пытаясь найти разные решения.
Одно из решений, которое сработало для меня, заключается в следующем: я убедился, что все данные рабочего листа, которые я использую, - это все строки / текст, и преобразовал все пустые записи в тип String и ввел пустую строку.Таким образом, следующий код выполняет эту задачу:
#house keeping
for eachrow in ws_IntMstDBF.iter_rows(min_row=2, max_row=ws_IntMstDBF.max_row, max_col=ws_IntMstDBF.max_column):
for idx, cells in enumerate(eachrow):
if cells.value is None: # change every Null cell type to String and put 0x20 (space)
cells.data_type = 's'
cells.value = " "
После написания рабочего листа я снова открыл его, используя panda dataframe, и проверил, все ли содержимое имеет строковый тип, и что в dataframe не осталось значений «nan».Затем я использовал функцию df2dbf из «Dani Arribas-Bel», изменил ее в соответствии с данными, с которыми я работаю, и преобразовал в dbf.
Код, который импортирует фрейм данных и преобразует его в формат dbf, выглядит следующим образом:
abspath = Path(__file__).resolve() # resolve to relative path to absolute
rootpath = abspath.parents[3] # root (my source file is3 sub directories deep
xlspath = rootpath / 'sub-dir1' / 'sub-dir2' / 'sub-dir3' / 'test.xlsx'
# above code is only resolving file location, ignore
pd_Mst_df = pd.read_excel(xlspath)
#print(pd_Mst_df) # for debug
print("... Writing Master DBF file ")
df2dbf(pd_Mst_df, dbfpath) # dbf path is defined similar to pd_Mst path
Функция df2dbg использует pysal для записи кадра данных в формате dbf: я внес некоторые изменения в код для определения длины строки длины и типов символов следующим образом:
import pandas as pd
import pysal as ps
import numpy as np
# code from function df2dbf
else:
type2spec = {int: ('N', 20, 0),
np.int64: ('N', 20, 0),
float: ('N', 36, 15),
np.float64: ('N', 36, 15),
str: ('C', 200, 0)
}
#types = [type(df[i].iloc[0]) for i in df.columns]
types = [type('C') for i in range(0, len(df.columns))] #84)] #df.columns)] #range(0,84)] # i not required, to be removed
specs = [type2spec[t] for t in types]
db = ps.open(dbf_path, 'w')
# code continues from function df2dbf
Pandas dataframe didnне требует дальнейших изменений, так как все исходные данные были правильно отформатированы перед передачей в файл Excel.
Я предоставлю ссылку на pysal и df2dbf, как только найду ее в stackoverflow.