阅读Excel错误地parsing欧洲date(Python 3.4.3 || Pandas 0.17.0)

在下列问题中,似乎还没有答案。

从excel中读取date到Pandas Dataframe

在欧洲的机器上,pandas在使用欧洲格式(dd-mm-yyyy)从Excelsheet中parsingdate时有一个令人困惑的错误。 date编号从1到12的date将自动转换为美国标准(mm-dd-yyyy),而date编号> 12的date则以欧洲方式(dd-mm-yyyy)parsing。 这显然会导致问题。

  • 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,总是会有一个解决scheme来处理date并切换它们,但这似乎不是它想要的工作方式。 有没有人find更好的解决scheme? 提前致谢!

python:'3.4.3 | Anaconda 2.1.0(x86_64)| (默认,2015年10月20日,14:27:51)\ n [GCC 4.2.1(Apple Inc. build 5577)]

pandas:“0.17.0”

编辑17 2015年11月

自己find解决方法/解决scheme:包含dayfirst = True with to_datetime()

它对我来说似乎仍然是一个错误。 我添加了我的代码的简化版本,以提供更多的上下文。 该脚本读取带有个人数据的Excel表格,并转换为创build可用于服务器上载的新表格。 input可以变化很多,但我简化了这个例子。

在代码中添加我的解决scheme,并让它做出2个date输出:一个和一个没有dayfirst = True

在两个不同的Excel表单上运行代码。 一个没有任何问题(xlsx文件,例2),另一个(xls,例1)有不同的列。 pandas似乎正确地识别日月,但难以从date创build一个string,并在ipython输出自动混合的顺序。

例如1的input列表 输入列表例如

xls文件的最终列表,请参见名称4的问题 xls文件的最终列表,请参见名称4的问题

例如2的input列表 例如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参数converters

转换器 :字典,默认无

用于转换某些列中的值的函数的字典。 键可以是整数或列标签,值是接受一个input参数的函数,Excel单元格内容,并返回转换的内容。

如果你想处理错误,如果你想处理错误date,添加参数添加参数errors='coerce'

Demoformat='%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