Неверный синтаксический анализ Excel в Excel (Python 3.4.3 || Pandas 0.17.0)

В строке следующего вопроса, на который пока еще нет ответа.

Чтение дат из Excel в Pandas Dataframe

На европейских машинах Pandas имеет запутанную ошибку при разборе дат с Excelsheet с европейским форматом (dd-mm-yyyy). Даты с номером дня от 1 до 12 автоматически преобразуются в американский стандарт (mm-dd-yyyy), а даты с номером дня> 12 анализируются по-европейски (dd-mm-yyyy). Это, очевидно, приводит к проблемам.

  • 10-05-2011 => 05-10-2011
  • 05-10-2011 => 10-05-2011
  • 31-05-2011 => 31-05-2011
  • 14-12-2011 => 14-12-2011

Всегда есть решение, чтобы опубликовать даты и переключить их, если «день» и «месяц» <13, но это, похоже, не так, как предполагается. Кто-нибудь нашел лучшее решение? Заранее спасибо!

python: '3.4.3 | Anaconda 2.1.0 (x86_64) | (по умолчанию, 20 октября 2015, 14:27:51) \ n [GCC 4.2.1 (Apple Inc. build 5577)]

Панды: '0,17,0'

EDIT 17 ноября 2015 г.

Обнаружено обходное решение / решение: включено dayfirst = True с to_datetime ()

Мне все это кажется ошибкой. Я добавил упрощенную версию своего кода, чтобы дать еще один контекст. Сценарий читает excelsheet с личными данными и конвертирует для создания нового листа, который можно использовать для загрузки сервера. Вход может меняться довольно много, но я упростил пример.

Добавлено мое решение в коде и дайте ему сделать 2 вывода даты: один с одним и одним без dayfirst = True

Измените код на двух разных листах Excel. У одного не было проблем вообще (файл xlsx, пример 2), а другой (xls, пример 1) имел разницу между столбцами. Кажется, что pandas правильно распознает день и месяц, но с трудом создает строку из даты и автоматически смешивает порядок в выводе ipython.

Список ввода, например, 1 Список входных данных, например

Окончательный список для файла xls, см. Проблему с именем 4 Окончательный список для файла xls, см. Проблему с именем 4

Список ввода, например, 2 Список ввода, например, 2

Окончательный список для xlsx-файла, без проблем с именем 3 Окончательный список для xlsx-файла, без проблем с именем 3

# Module for test list path = "xxxx" namefile = "testlist 1.xls" #namefile = "testlist 2.xlsx" schoolnaam = 'schoolname' BRIN = 'XXXX' meetperiode = 'MPX' meetjaar = '20xx/20xx' os.chdir(path) df = pd.DataFrame() df = pd.read_excel(namefile,0, header = None, parse_dates = True) df1 = pd.DataFrame() df1 = df df1.columns = ['Leerlingnummer', 'Achternaam', 'Geslacht', 'Blank', 'Leerjaar', 'Gebdatum'] df1 = df1[['Leerlingnummer', 'Achternaam', 'Geslacht', 'Gebdatum']] # Sheet Leerling df1.loc[df1['Leerlingnummer'].str.contains('Groep|/|A|B|C|D|E|F|G|H|I|J', na=False), 'Naam groep'] = df1.Leerlingnummer df1['Naam groep'] = df1['Naam groep'].ffill() df1.dropna(thresh=5, inplace = True) df1['Achternaam'] = df1['Achternaam'].str.strip() df1['Geslacht'] = df1['Geslacht'].str.strip().str.upper() df1['Naam groep'] = df1['Naam groep'].str.strip() df1['Voornaam'] = np.nan df1['Tussenvoegsel'] = np.nan df1['Geboortedatum']= pd.to_datetime(df1.Gebdatum).apply(lambda x: x.strftime('%d-%m-%Y')) df1['Geboortedatum2']= pd.to_datetime(df1.Gebdatum, dayfirst=True).apply(lambda x: x.strftime('%d-%m-%Y')) dfLeerling = df1[['Achternaam','Voornaam','Tussenvoegsel','Geslacht','Geboortedatum','Geboortedatum2','Naam groep']] # Sheet Groep gb = df1.groupby('Naam groep') klaslijst = list(gb.groups) klaslijst.sort() dfGroep = pd.DataFrame(data = klaslijst, columns=['Naam groep']) dfGroep['Lesjaar'] = meetjaar dfGroep['Naam leraar'] = np.nan dfGroep['Opmerkingen'] = np.nan # Sheet School dfSchool = pd.DataFrame({'BRIN': BRIN, 'Naam school': schoolnaam, 'Adres':[np.nan], 'Postcode':[np.nan], 'Plaats':[np.nan], 'Telefoon':[np.nan], 'Email':[np.nan], 'Website':[np.nan]}) dfSchool = dfSchool[['BRIN','Naam school','Adres','Postcode','Plaats','Telefoon','Email','Website']] # Writer namefile2 = 'Final list %s %s.xlsx' % (schoolnaam, meetperiode) writer = pd.ExcelWriter(namefile2) dfSchool.to_excel(writer, 'School', index=False) dfGroep.to_excel(writer, 'Groep', index=False) dfLeerling.to_excel(writer, 'Leerling', index=False) writer.save() dfLeerling.head() 

Вы можете использовать преобразователи параметров функции read_excel :

преобразователи : dict, по умолчанию Нет

Dict функций для преобразования значений в определенные столбцы. Ключи могут быть целыми или столбцами, значения – это функции, которые принимают один входной аргумент, содержимое ячейки Excel и возвращают преобразованное содержимое.

Если вам нужны ошибки процесса, добавьте параметр, если вы хотите, чтобы даты errors='coerce' процесса добавляли errors='coerce' параметра errors='coerce' .

Демо- format='%d-%m-%Y' :

 import pandas as pd def converter(x): #define format of datetime return pd.to_datetime(x, format='%d-%m-%Y') #define each column converters={'col1': converter, 'col2': converter} #read excel with parameter converters (need dictionary) df = pd.read_excel('test.xlsx', converters=converters) print df # col1 col2 #0 2011-05-10 2011-05-31 #1 2011-10-05 2011-12-14 

Demo1format='%m-%d-%Y' :

 import pandas as pd def converter(x): #define format of datetime return pd.to_datetime(x, format='%m-%d-%Y', errors='coerce') #define each column converters={'col1': converter, 'col2': converter} #read excel with parameter converters (need dictionary) df = pd.read_excel('test.xlsx', converters=converters) print df # col1 col2 #0 2011-10-05 NaT #1 2011-05-10 NaT