阅读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的问题
例如2的input列表
最终名单为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'
。
Demo – 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
Demo1 – format='%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