读取Excel时错误地解析欧洲日期(Python 3.4.3||Pandas0.17.0)

xpszyzbs  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(86)

在下面的问题中,似乎还没有答案。
Read dates from excel to Pandas Dataframe
在欧洲的机器上,Pandas在解析欧洲格式(dd-mm-yyyy)的Excel表格中的日期时有一个令人困惑的bug。日期编号从1到12的日期将自动转换为美国标准(mm-dd-yyyy),而日期编号〉12的日期将以欧洲方式(dd-mm-yyyy)解析。这显然会导致问题。

  • 2011年5月10日=〉2011年10月5日
  • 2011年10月5日=〉2011年5月10日
  • 2011年5月31日=〉2011年5月31日
  • 2011年12月14日=〉

如果“日”和“月”都小于13,总有一个解决方案可以后处理日期并将其转换,但这似乎不是它应该的工作方式。有人找到更好的解决方案吗?提前感谢!
Python:'3.4.3|水蟒2.1.0(x86_64)|(默认值,2015年10月20日14:27:51)\n[GCC 4.2.1(苹果公司内部版本号5577)]
Pandas:“0.17.0”
2015年11月17日编辑
我自己找到了变通方法/解决方案:包含dayfirst=True,带有to_datetime()
对我来说,这仍然是一个bug。我添加了代码的简化版本,以给予更多的上下文。脚本读取包含个人数据的Excel工作表,并进行转换以创建一个可用于服务器上载的新工作表。输入可能会有很大变化,但我简化了示例。
在代码中添加了我的解决方案,并让它生成2个日期输出:一个带有和一个不带有dayfirst=True
在两个不同的excel工作表上运行代码。一个完全没有问题(xlsx文件,示例2),另一个(xls,示例1)列之间有差异。看起来panda可以正确识别日和月,但是很难从日期创建字符串,并且在ipython输出中自动混淆顺序。
输入列表,例如1 x1c 0d1x
xls文件的最终列表,请参见名称4

的问题
输入列表,例如2

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()
ni65a41a

ni65a41a1#

当这种情况发生时,我创建的 Dataframe 已经强制日期列的类型为str,因此它不会得到任何解释

dtype={'x':'str','y':'str'}

然后,可以使用to_datetime()方法指出所需的格式

format='%d/%m/%Y'

相关问题