Как избежать того, чтобы панды не преобразовывали нулевые значения из utf8 в строку при использовании to_sql? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть несколько файлов данных Excel, которые я хочу импортировать в базу данных MySQL. Я создал скрипт для этого с пандами (read_excel), и поскольку у меня есть акценты и другие специальные символы, я должен кодировать данные, считанные пандами, в utf8 с помощью .str.encode () (и моя база данных MySQL - utf8),Проблема в том, что когда я импортирую данные в БД с помощью to_sql (), pandas преобразует все нулевые значения (NaN, NaT, Null, ...) в строку ...

Я пробовал много кодировок. Я попытался заменить нулевые значения на fillna (), а также заменить их на None, я также установил mysql, чтобы избежать недопустимых значений (STRICT_TRANS MODE и NO_ZERO_DATE для NaT)

for y in range(0,len(FICHIERS)):
DONNEES[FICHIERS[y].split('.')[0]] = pd.read_excel(os.path.join(APPLICATION_PATH,CONFIG.get('Excel','Chemin_Excel')+ FICHIERS[y] ), index_col=None) 

def convertUTF(dataset):
    for col in dataset:
        dataset[col] = dataset[col].astype(str).str.encode(encoding='UTF-8',errors='replace')
    return dataset

#converting all data to utf8
for nom, valeur in DONNEES.items():
        DONNEES[nom] = convertUTF(valeur)

#insert into the db
engine = create_engine(INFOS_CONNECTION, encoding="utf-8", echo=True)
con = engine.connect()
con.execute("SET GLOBAL SQL_MODE='NO_ZERO_DATE';")
con.execute('SET FOREIGN_KEY_CHECKS=0;')
con.execute('SET NAMES utf8;')
con.execute('SET CHARACTER SET utf8;')
con.execute('SET character_set_connection=utf8;')

for k, v in DONNEES.items():
    v.to_sql(con=con, name=k.lower(), if_exists='append',index=False)

Здесьмои данные, когда я импортирую в MySQL, NaT становится 0000-00-00 (как строка) и NaN "nan" (также как строка ... я также пытался заменить ноль на "NULL", но он остается в виде строки .. . не реальное нулевое значение sql).

print(DONNEES['T_Liste******t'])

CodePersonnel PrenomEnfant NomEnfant DateNaissance DateDeces  Enfant***     Sexe  ClientPresent  Archiver
0            -------      -------    -------    1985-05-05       NaT              NaN     1              0         0
1            -------        -------   -------    1991-02-11       NaT            NaN     2              0         0
2            -------    -------    -------    1990-01-26       NaT             NaN     2              0         0
3            -------    -------    ------- 1982-11-23       NaT        NaN     2              0         0
4           -------       -------   -------   1985-06-07       NaT        NaN     1              0         0
...              ...          ...       ...           ...       ...       

(я заменил имена на ------ по безопасности)

...