【问题标题】:How to standardise different date formats in pandas?如何标准化熊猫中的不同日期格式?
【发布时间】:2019-07-19 03:59:42
【问题描述】:

我有一个 csv 格式的数据集,其中包含一列中的日期。我已将此数据集导入 python pandas,并且此日期列显示为一个对象。我需要将此列转换为日期时间,但我有问题。此日期列有两种格式的日期格式 1. 2013 年 11 月 7 日 11:51 2. 13-07-2013 08:33:16

我需要将一种格式转换为另一种格式,以便在我的 python 中使用标准日期格式进行分析。我该怎么做?

这两种格式都有很多行日期,所以当我尝试使用以下代码将第二种格式转换为第一种格式时

print(df['date'].apply(lambda x: pd.to_datetime(x, format='%d/%m/%Y %H:%M')))

我收到以下错误

ValueError: 时间数据 '13-07-2013 08:33:16' 与格式不匹配 '%d/%m/%Y %H:%M'(匹配)

那么以一种格式标准化此列的最佳方法是什么?

【问题讨论】:

  • 您能做的最好的事情可能是先将“/”替换为“-”,然后转换为日期时间。
  • 第一次约会是 11 月 7 日还是 7 月 11 日?
  • 假设您使用pd.read_csv 导入数据集,包含parse_dates = 'date', infer_datetime_format = True 会不会更容易?

标签: python pandas


【解决方案1】:

尝试删除format 参数并在传递给pd.to_datetime 的参数中设置infer_datetime_format=True

【讨论】:

  • 我收到此错误 TypeError: to_datetime() got an unexpected keyword argument 'infer_datetime'
  • infer_datetime_format 上的这篇文章表明它是一个加速工具,而不是解析不同格式的工具。 stackoverflow.com/questions/51571615/…
【解决方案2】:

最好使用 strftime():

df = pd.DataFrame({'Date': ['11/7/2013 11:51','13-07-2013 08:33:16']})
df['Clean_Date'] = df.Date.apply(lambda x: pd.to_datetime(x).strftime('%d/%m/%Y %H:%M'))
print(df)

输出:

                  Date        Clean_Date
0      11/7/2013 11:51  07/11/2013 11:51
1  13-07-2013 08:33:16  13/07/2013 08:33

【讨论】:

    【解决方案3】:

    你可以试试下面的

    import pandas as pd
    import numpy as np
    
    
    n=1000
    ch = ['13-07-2013 08:33:16', '13/07/2013 08:33:16']
    df = pd.DataFrame({"date": np.random.choice(ch,n)})
    
    df["date"] = df["date"].str.replace("/","-").astype("M8[us]")
    

    更新 我只是意识到我使用的格式与您想要的不同。我强烈建议您使用标准格式 YYYY-MM-DD 和 datetime 作为类型而不是字符串。有很多帖子解释了为什么这在 RAM 上更高效,然后更快。

    一个只有 1000 行的 df 的小比较

    %%timeit
    out = df["date"].str.replace("/","-").astype("M8[us]")
    
    146 ms ± 5.62 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    
    %%timeit
    out = df["date"].apply(lambda x: pd.to_datetime(x)\
                                       .strftime('%d/%m/%Y %H:%M'))
    
    396 ms ± 22.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    
    %%timeit
    out = df['date'].apply(lambda x: pd.to_datetime(x,
                           format='%d/%m/%Y %H:%M',
                           infer_datetime_format= True))
    
    425 ms ± 4.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    【讨论】:

      【解决方案4】:

      在 Pandas v1 中,to_datetime 函数非常强大,可以处理大多数日期格式。使用您的示例日期,就像在您的系列中调用 to_datetime 一样简单。

      d = ['11/7/2013 11:51', '13-07-2013 08:33:16']
      df = pd.DataFrame({'dates': d})
      df = pd.to_datetime(df['dates'])
      df
      

      输出

      0   2013-11-07 11:51:00
      1   2013-07-13 08:33:16
      Name: dates, dtype: datetime64[ns]
      

      to_datetime 到底有多强大?

      让我们使用来自here 的 25 种不同日期样式的数据集对其进行测试。

      http = r'https://www.ibm.com/docs/en/cmofz/10.1.0?topic=SSQHWE_10.1.0/com.ibm.ondemand.mp.doc/arsa0257.htm'
      table = pd.read_html(http)
      df = table[0]
      df
      
      # test which datestyles pandas can convert
      df['Example_clean'] = pd.to_datetime(df['Example'])
      print(df.dtypes)
      df
      # yes it converted all 25 different date formats!!
      # Note - when using a time it automatically uses todays date.
      

      输出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2019-02-24
        • 2014-02-23
        • 2022-06-13
        • 2016-12-02
        • 2019-11-28
        相关资源
        最近更新 更多