Панды читают дату как строку вместо даты и времени - PullRequest
0 голосов
/ 26 июня 2019

Я пишу программу для загрузки файла Excel в базу данных, но при использовании pandas для загрузки данных выдается ошибка, так как она читает дату в виде строки, хотя то же самое работает с openpyxl

Codeиспользование кода Pandas

    try:
        Conf=LoadConfig.loadConfig()
        cursor, connection =Util.getConnection(Conf['SRC'])
        data = data.applymap(lambda s: removeSpecialCharacters(s))
        columNameList=[col for col in data.columns]
        DataListInp=data.to_dict('records')

        query='TRUNCATE TABLE '+name
        cursor.execute(query)

        query='insert into '+name+'('
        columnstring=",".join(str(x) for x in columNameList)
        paramString=",".join(':'+str(x) for x in columNameList)

        finalquery=query+columnstring+') values( '+paramString+')'
        cursor.prepare(finalquery)
        cursor.executemany(None, DataListInp)
        connection.commit()
    except Exception as  e:
        print(e)
        traceback.print_exc()
    finally:
        if cursor is not None:
            cursor.close()
            connection.close()

def loadExcel(filename,sheets):
    sheetList=sheets.split(',')
    sheets_dict = pd.read_excel(filename, sheet_name=sheetList,keep_default_na=False)
    for name, data in sheets_dict.items():
        print(name,'Sheet Loading Start')
        loadSheets(data,name)
        print(name,'Sheet Loading Finished')

Использование OpenPyxl:

    try:
        cursor, connection =Util.getConnection(Conf['SRC'])
        SheetData=tuple(ws.values)
        columNameList=list(SheetData[0])
        DataListInp=list(SheetData[1:])
        #DataList = [tuple(map(lambda i: str.replace(str(i),'\xa0',"") if isinstance(i, str) else i, tup)) for tup in DataListInp]
        DataList = [tuple(map(lambda i: str.replace(str.replace(str.replace(str(i),'_x000D_'," "),'\xa0'," "),'\n'," ") if isinstance(i, str) else i, tup)) for tup in DataListInp]
        paramDictionary=[dict(zip(columNameList,row)) for row in DataList]
        query='insert into '+ws.title+'('
        columnstring=",".join(str(x) for x in columNameList)
        paramString=",".join(':'+str(x) for x in columNameList)
        finalquery=query+columnstring+') values( '+paramString+')'
        cursor.prepare(finalquery)
        cursor.executemany(None, paramDictionary)
        connection.commit()
    except Exception as  e:
        print(e)
        traceback.print_exc()
    finally:
        if cursor is not None:
            cursor.close()
            connection.close()


if __name__ == '__main__':
        if len(sys.argv) != 3:
            logging.debug("No of Parameter should be 2 . 1= file_name, 2= sheets")
            exit()
        i_runParams=sys.argv
        file_name=i_runParams[1]
        sheets=i_runParams[2]
        print(file_name)
        print(sheets)
        wb=openpyxl.load_workbook(file_name,data_only=True)
        sheetList=sheets.split(',')
        print(sheetList)
        for sheet in sheetList:
            ws=wb[sheet]
            print(ws.title,' Sheet Loading Start')
            loadSheets(ws)
            print(ws.title,'Sheet Loading Finished')

Проблема заключается в том, что pandas читает поле даты в Excel, как показано ниже: CREATE_DATE: 2019-04-04 00:00:00 ',' UPDATE_DATE ':' 2019-04-04 00:00:00 ',

, хотя OpenPyxl читает как

' CREATE_DATE ': datetime.datetime (2019, 4, 4, 0, 0), 'UPDATE_DATE': datetime.datetime (2019, 4, 4, 0, 0)

Как мы можем получить тот же результат от панд?не может изменить тип данных столбца, так как мы не знаем, какой столбец будет датой, он должен быть динамическим

1 Ответ

0 голосов
/ 26 июня 2019

Можете ли вы добавить оператор try, который будет пытаться преобразовать поля по мере их загрузки в datetime и продолжить в случае сбоя?

import pandas as pd

Date = '01-02-2019'
NotDate = 'Not Date'
for i in [Date, NotDate]:
    try:

        if pd.to_datetime(i):
            print(i + ' is a date')

    except:
        print(i + ' is not a date')

Вывод:

01-02-2019 is a date
Not Date is not a date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...