Как вы справляетесь с неверными данными при преобразовании XLS в MySQL DB - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю над проектом, в котором мне нужно преобразовать базу данных внутри файла XLS в MySQL. У меня уже работает код python, который может это сделать, но я не уверен в правильном способе динамической обработки краевых случаев.

End Date  
04/12/2006 10:00:00  
04/12/2006 11:00:00  
4/12/2006 13:00:00 PM  

Например, у меня есть один столбец дат здесь. Очевидно, что я могу отредактировать ячейку здесь вручную, чтобы она соответствовала другому формату даты, но это не масштабируется, если есть тысячи дат.

Я также могу написать python код для обработки этого указанного c искаженного формат даты, но он не будет работать для других искаженных дат.

  for c in range(0,col_names.ncols):
        #Ctype 3 means its a date. 1 is for Text
        if col_names.cell(r,c).ctype == 3:
            raw_time = xlrd.xldate_as_tuple(col_names.cell(r,c).value, book.datemode)
            rowData.append(str(datetime.datetime(*raw_time)))
        else:

            if col_names.cell(r,c).value == 'NULL':
                rowData.append(None)
            elif "PM" in col_names.cell(r,c).value:
                col_names.cell(r,c).value = col_names.cell(r,c).replace("PM","")

            elif "AM" in col_names.cell(r,c).value:
                col_names.cell(r,c).value = col_names.cell(r,c).replace("AM","")

            else:
                rowData.append(col_names.cell(r,c).value)

Я попытался установить этот столбец в Excel в формате даты. Все остальные ячейки, кроме последней, преобразуются в порядке.

Существуют ли какие-либо программы или методы, которые позволят мне переопределить любую строку даты в этом столбце в правильном формате?

Имеют ли другие программы, такие как SAS, лучшую способность динамически форматировать входные данные?

1 Ответ

0 голосов
/ 17 февраля 2020

SAS имеет несколько различных типов функций автоматического считывания даты.

Предположим, что ваша дата отформатирована именно так в Excel. Поскольку он содержит несколько форматов даты и времени, а последний формат определяется как символ, Excel преобразует некоторые из известных дат в число дней с 1 января 1900 года. SAS будет считывать необработанные значения в виде символов.

End Date
38819.416666667
38819.458333333
4/12/2006 13:00:00 PM

Мы можем использовать формат anydtdtm. для чтения в различных форматах даты и времени. Если вы найдете /, :, - или , предположите, что это дата, которую Excel не может распознать как дату. В противном случае настройте дату и время в Excel на дату и время SAS (количество секунд с 1 января 1960 года), сократив число дней до даты De c 30th 1899 и преобразовав дни в секунды, используя функцию DHMS (). Причина использования De c 30-го вместо 1-го января заключается в том, что SAS и Excel расходятся во мнениях относительно того, считать ли они с нуля или единицы, и потому что Excel ошибочно считает 1900 год високосным годом.

data want;
    set have;

    if(findc('end date'n, '/:- ') ) then end_datetime = input('end date'n, anydtdtm.);
        else end_datetime = dhms('end date'n + '30dec1899'd,0,0,0);

    format end_datetime datetime32.;
run;

Это работает для три случая, которые вы дали. Вам нужно будет проверить другие случаи, чтобы увидеть, что происходит. Если Excel распознает все как дату и время, вам не нужно вручную преобразовывать дату в SAS, а proc import будет обрабатывать все.

...