Даты разбора Pandas DataFrame - PullRequest
0 голосов
/ 12 июля 2019

Я пытаюсь загрузить кучу ExcelSheets в таблицу Oracle. Excelsheets не соответствуют. Таким образом, таблицы в Oracle должны генерироваться динамически на основе столбца в Excelsheets. Это самое простое решение, которое я нашел в интернете, поэтому я продолжил этот подход. Я новичок в Python.

Взяв следующую структуру в качестве примера.

enter image description here

Я пытаюсь импортировать следующий файл Excel в таблицу MEM_TABLE . Поле DATE является непоследовательным, в качестве значений может быть указано NA, _ND или Date.

Код, который я использовал для загрузки Excel, ниже

xls_file = pd.ExcelFile("Excel File")

df =  xls_file.parse('Sheet1',parse_dates=True)
df =  df.replace(np.nan, '') #replace NaN with blank string
df = df.replace('NA', '') #replace "NA" with blank string
df = df.replace('_ND', '') #replace "NA" with blank string
df.to_sql('MEM_TABLE', conn_ora, if_exists='append', index = False )

Таблица, созданная методом to_sql , имеет следующую структуру

MEM_TABLE(
  date    CLOB         NULL,
  emp_nbr NUMBER(19,0) NULL
)

В dataframe это читает что-то вроде этого

 DATE                       EMP_NBR
0                             2
1  2018-01-04 00:00:00        1
2  2018-01-01 00:00:00        2
3  2018-01-03 00:00:00        1
4                             1
5                             1

Похоже, что Pandas выполняет автоматическое приведение к дате 1/4/2018 при создании DataFrame. Ниже приведена ошибка, которая, как я полагаю, заключается в том, что столбец DATE в таблице MEM_TABLE имеет тип CLOB, а в dataFrame поле Date содержит объект DATE. Похоже, объект даты не может быть вставлен в ячейку CLOB.

TypeError: ожидается объект строки или байта

Если Даты указаны в строке (например, "1/4/2018"), я не получаю никаких ошибок.

Мой вопрос здесь Есть ли в любом случае отключить автоматический анализ в поле даты, пока создается кадр данных?

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Обходное решение, которое я использовал, я создал метод undate (используется из существующего решения), чтобы вернуть дату назад в исходный формат.И запустил метод во всех столбцах DataFrame.Реализация - жестокая сила, но она работает: P.Мой окончательный код выглядит примерно так:

def undate(x):
    if pd.isnull(x):
        return x
    try:
        return x.strftime('%d/%m/%Y')
    except AttributeError:
        return x
    except Exception:
        raise

for col in df.columns:
        df[col] = df[col].apply(undate)
0 голосов
/ 12 июля 2019

При чтении в фрейме данных панд используйте 'parse_dates' = False

df = xls_file.parse('Sheet1',parse_dates=False)

...