Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pandas、python中的数据解析_Python_Excel_Pandas_Date_Text Parsing - Fatal编程技术网

pandas、python中的数据解析

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,如果我只

我有一个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,如果我只是将其重新格式化为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列中的数据转换为相同的格式,这样我就可以使用熊猫应用过滤器。 我认为有两种解决方案:

  • 告诉Pandas不要将文本转换为日期(但它已经作为日期类型保存在库存文件中,是否有效?)
  • 以某种方式忽略文本值并使用date_parser=方法将add dates转换为DD/MM/YY
  • 在pd.to_datetime的帮助下,将20年5月26日转换为2020年5月26日,然后将2020-09-06 00:00:00转换为2020年6月9日(似乎是最简单的转换,但忽略参数不起作用。)

  • 这里是小样本文件的链接,我认为,首先应该导入文件而不进行日期解析,然后使用以下方法将其转换为日期格式:

    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
    所以在Excel文件中,它们被标记为datetime

    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_首先做什么,我建议您查看文档并稍作修改。你也可以一个接一个地执行我建议的步骤。