【问题标题】:Pandas reads date from CSV incorrectlyPandas 错误地从 CSV 中读取日期
【发布时间】:2023-02-20 15:40:14
【问题描述】:

我是 Python 的新手,发现它非常令人沮丧。 我有一个正在导入的 CSV,但它读取的日期列不正确。 在月份列中,我有每个月的第一天 - 所以它应该是 (yyyy-mm-dd):

2020-01-01
2020-02-01
2020-03-01
etc

然而,它读作 (yyyy-dd-mm)

2020-01-01
2020-01-02
2020-01-03
etc

我尝试了 stackoverflow 和其他网站的几种转换函数,但它们要么不起作用,要么什么都不做。

我的导入如下:

try:
    collections_data = pd.read_csv('./monthly_collections.csv')
    print("Collections Data imported successfully.")
except error as e:
    print("Error importing Collections Data!")

我在导入时尝试了 parse_dates 参数,但它没有帮助。

如果我再试试这个:

temp = pd.to_datetime(collections_data['Collections Month'], format='%m/%d/%Y')
temp 

然后我得到

你可以看到,它把月份读成天——换句话说,它显示了一个月中的每一天,而不是每个月的第一天。

我非常感谢一些帮助来更正这些日期,因为我需要对它们进行一些日期计算,并根据此日期连接两个表 - 这将是我的下一个问题。

亲切的问候

【问题讨论】:

  • 您可以发布您尝试过但在从 csv 中读取时无效的代码吗
  • 使用pd.read_csv()的dayfirst = Truekwarg。对于不明确的日期,默认行为是假定日期采用月份优先格式。在您尝试使用 pd.to_datetime() 时,您已经使用了 format='%m/%d/%Y',它明确表示您的日期采用月份优先格式,如果您切换 %m 和 %d 的位置,那也可以。

标签: python pandas date


【解决方案1】:

推断日期格式

有些日期不明确,有些则不然。考虑这些日期:

  1. 2020-27-01
  2. 2020-12-14
  3. 2020-01-02
  4. 11-10-12

    在示例 #1 和 #2 中,我们可以轻松推断出该日期格式。在示例#1 中,前四位数字必须是年份(没有第 2020 个月或第 2020 天),接下来的两位数字必须是该月的第几天(没有第 27 个月,我们已经有年份信息) 最后两位数字是月份(我们已经有了年和月中的日期信息)。对于示例 #2,我们可以使用类似的方法。

    例如#3 是第二个月的第一天,还是第一个月的第二天?没有更多信息就无法判断。例如,如果我们有以下日期序列:'2020-22-01'、'2020-25-01'、'2020-01-02',可以合理推断'2020-01-02'指的是第二个月的第一天,否则我们将无法解析前两个日期。

    在示例 #4 中,无法推断日期格式。任何一对数字都可以理解为年、月或日。 (使用 pandas.read_csv() 您可以使用 dayfirst 和 yearfirst kwargs,或者明确声明您的日期格式并使用pandas.to_datetime(some_df, format=)。

    你的问题

    您的日期不明确,从您在问题中包含的内容无法推断它是一天第一格式(dd-mm)还是一个月第一格式(mm-dd)。 pandas 默认为 dayfirst=False 所以像你的日期 2020-02-01 这样的日期应该是第一个月的第二天除非你具体否则。 See pandas.read_csv()。

    第一天:布尔值,默认错误的

    DD/MM 格式日期,国际和欧洲格式。

    以上意味着为了将 01/02 (DD/MM)、2020/02/01(iso/国际格式)或 01/02/2020(欧洲格式)解析为第二个月的第一天,您需要指定pandas.read_csv(somefile.csv, ... dayfirst=True)。

    我尝试了 stackoverflow 和其他网站的几种转换函数,但它们要么不起作用,要么什么都不做。

    您没有提供您使用过但不起作用的代码,也没有提供您使用的将日期解析为月份的代码。如果您包含一个您实际尝试过的示例,我可以发表具体评论。

    在你的问题中,你说你的日期格式是 (yyyy-mm-dd) 但你传递了 format='%m/%d/%Y' 并且在你的屏幕截图中你在不同的地方有'/'和'-'作为你的分隔符。所以我不确定您的原始日期是什么样的。

    您传递给 format kwarg 的内容表示前两位数字是零传递月份(即 04),后跟“/”,然后是零填充天数,然后是“/”,然后是年作为年。如果你在问题开头写的是正确的,你应该已经通过了format='%Y-%m-%d'(see the strftime format codes)。

【讨论】:

    【解决方案2】:

    试试https://towardsdatascience.com/4-tricks-you-should-know-to-parse-date-columns-with-pandas-read-csv-27355bb2ad0e

    本质上,尝试 read_csv 函数的 dayfirst 可选输入。 你会把它设置为 True 并且有

    collections_data = pd.read_csv('./monthly_collections.csv', dayfirst = True)
    

    【讨论】:

    • OP 实际上需要相反的dayfirst = True。 False 是默认选项,也是 OP 问题的原因。
    • 啊哎呀你是对的我读得太快了。
    • 这没有任何作用。
    • 我实际上输入了 dayFirst=True(实际上不是),现在它开始工作了。 (PS 这就是为什么我发现 Python 如此令人沮丧。文档中的函数/参数并不总是按照他们说的去做)。
    • 大写的?诡异的。至少你修好了!祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多