首页 > 解决方案 > pandas,python中的数据解析

问题描述

我有一个包含许多列的 excel 文件,其中之一,“Column3”是日期,其中包含一些文本,基本上它看起来像这样:

26/05/20
XXX
YYY
12/05/2020

数据以 DD/MM/YY 格式写入,但 pandas 和 excel 一样认为 12/05/2020 是 2020 年 12 月 5 日,而它是 2020 年 5 月 12 日。(我的窗口设置为美国日期格式)

重要提示:当我打开股票 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.

在这种情况下,我的 26/05/20 已正确转换为 2020 年 5 月 26 日,但我丢失了所有文本数据(没关系)和其他与我的格式参数不匹配的日期。因为以前它们被认为是美式日期。

我的目标是将 Column3 中的数据转换为相同的格式,以便我可以使用 pandas 过滤器。我认为这是几个解决方案:

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

这是小示例文件的链接https://easyupload.io/ca5p6w

标签: pythonexcelpandasdatetext-parsing

解决方案


您可以将 date_parser 传递给 read_excel:

dateparser = lambda x: pd.to_datetime(x, dayfirst=True)

pd.read_excel('test.xlsx', date_parser = dateparser)

推荐阅读