pandas、python中的数据解析
我有一个excel文件,有很多列,其中一列“Column3”是日期,里面有一些文本,基本上看起来是这样的:pandas、python中的数据解析,python,excel,pandas,date,text-parsing,Python,Excel,Pandas,Date,Text Parsing,我有一个excel文件,有很多列,其中一列“Column3”是日期,里面有一些文本,基本上看起来是这样的: 26/05/20 XXX YYY 12/05/2020 数据是以DD/MM/YY格式编写的,但pandas和excel一样,认为2020年5月12日是2020年12月5日,而现在是2020年5月12日。(我的windows设置为美国日期格式) 重要提示:当我打开stock excel文件时,带有12/05/2020的单元格已经是日期类型,尝试将其转换为文本时,它会给我44170,如果我只
26/05/20
XXX
YYY
12/05/2020
数据是以DD/MM/YY格式编写的,但pandas和excel一样,认为2020年5月12日是2020年12月5日,而现在是2020年5月12日。(我的windows设置为美国日期格式)
重要提示:当我打开stock excel文件时,带有12/05/2020的单元格已经是日期类型,尝试将其转换为文本时,它会给我44170,如果我只是将其重新格式化为DD/MM/YY,则会给我错误的日期
我添加了这行代码:
iport pandas as pd
dateparse = lambda x: pd.datetime.strptime(x,'%d/%m/%y')
df = pd.read_excel("my_file.xlsx", parse_dates=['Column3'], date_parser=dateparse)
但列中的文本会生成错误
ValueError: time data 'XXX' does not match format '%d/%m/%y'
我更进一步,手动删除了所有文本(显然我不能一直这么做),以查看它是否有效,但随后出现了以下错误
dateparse = lambda x: pd.datetime.strptime(x,'%d/%m/%y')
TypeError: strptime() argument 1 must be str, not datetime.datetime
我也试过:
df['Column3'] = pd.to_datetime(df.Column3, format ='%d/%m/%y', errors="coerce")
# if I make errors="ignore" it doesn't change anything.
在这种情况下,我的20年5月26日被正确地转换为2020年5月26日,但我丢失了所有文本数据(没问题)和其他与格式参数不匹配的日期。因为以前它们被认为是美式日期
我的目标是将第3列中的数据转换为相同的格式,这样我就可以使用熊猫应用过滤器。
我认为有两种解决方案:
这里是小样本文件的链接,我认为,首先应该导入文件而不进行日期解析,然后使用以下方法将其转换为日期格式: df['column3']=pd.to_datetime(df['column3'],errors='concurve')
希望这能起作用您可以通过日期解析器读取excel:
dateparser = lambda x: pd.to_datetime(x, dayfirst=True)
pd.read_excel('test.xlsx', date_parser = dateparser)
将此作为答案发布,因为评论太长 问题源于Excel。如果我在Excel中打开它,我会看到两个字符串,看起来像日期
26/05/20
,05/12/2020
和06/02/2020
。注意第24行和第48行的20
和2020
之间的差异,我在第4列中看到了日期。这似乎表明Excel是放在一起的。此Excel是通过复制粘贴组装的,还是通过编程组装的
仅用pd.read\u excel加载它会给出以下日期结果:
- 20年5月26日
- 2020-12-05 00:00:00
- 2020-02-06 00:00:00
df[“Column3”]。应用(类型)
给我
- str
df=pd.read\u excel(DATA\u DIR/“sample.xlsx”,dtype={“Column3”:str})加载它们将all的类型更改为str
,但不更改输出
如果打开提取文件,直接查看xml文件xl\worksheets\sheet1.xml
并查找单元格C26,您会看到它是44170
,而C5是6
,它是xl/sharedStrings.xml中对26/05/20
的引用
如何“制作”此Excel文件?这可以通过如何组合此文件来最好地解决
变通办法
作为一种解决方法,您可以逐段转换日期。不同的格式允许:
format1 = "%d/%m/%y"
format2 = "%Y-%d-%m %H:%M:%S"
然后,您可以执行pd.to_datetime(dates,format=format1,errors=“concurve”)
只获取第一个日期,对于不符合格式的日期执行NaT
。然后你用它来填补空隙
dates = df["Column3"] # of the one imported with dtype={"Column3": str}
dates_parsed = (
pd.to_datetime(dates, format=format1, errors="coerce")
.combine_first(pd.to_datetime(dates, format=format2, errors="coerce"))
.astype(object)
.combine_first(dates)
)
需要使用aType(object)
来用字符串值填充空格。共享一个小样本文件,其中包含您拥有的所有边缘案例以及预期的解决方案,然后我们可以测试这一点。您的目标是什么?你能添加你想要的输出吗?@MaartenFabré,数据新手-谢谢你帮助我把问题弄清楚。我添加了一个指向示例文件的链接,并指定了目标。这在20年5月26日起作用,但2020年5月12日读起来像是12月5日2020@Bowcoy嗯,试试这个日期分析器dateparser=lambda x:pd.to_datetime(x,格式='%d/%m/Y')
我试过了。由于列中的文本,它会生成一个错误。没有文本(我手动删除了它进行测试),它给出了相同的结果-2020年5月2日被解读为12月5日2020@Bowcoy,那么我很抱歉。我无法在我的计算机上重现您的问题。我尝试了parse_dates=False,但没有成功。我想这是因为在我上传到pandas的文件中,它已经是日期格式了。在将其加载到pandas DataFrame时,不要使用parse_dates参数。非常感谢,创建两种格式类型并将其逐段转换是一个非常好的主意。我不理解你的代码,但我用我的简化方式完成了,它工作得非常完美!非常感谢!“pd.to_datetime”部分应该足够简单。要检查combine_首先做什么,我建议您查看文档并稍作修改。你也可以一个接一个地执行我建议的步骤。