【问题标题】:Set the format for pd.to_datetime设置 pd.to_datetime 的格式
【发布时间】:2018-05-20 17:39:59
【问题描述】:

您好已经提到了to this post,但我无法解决我的问题。我的 CSV 中有一个列,它是字符串,示例值如下(请注意,monthyear 的位置有时会颠倒)。我需要在to_datetime 中设置什么格式?我尝试了以下所有方法

df = pd.read_csv("filename.csv") #Imagine there is a Month column

#[1] df["Month"] = pd.to_datetime(df["Month"])
#[2] df["Month"] = pd.to_datetime(df["Month"], format="%m/%d/%Y")

[Month]
Mar-97
Apr-97
May-97
Jun-97
Nov-00
Dec-00
1-Jan
1-Feb
1-Mar
1-Apr

我得到了错误

ValueError: day is out of range for month

对于 [1],我得到了

ValueError: 时间数据 'Mar-97' 与格式 '%m/%d/%Y' 不匹配(匹配)

对于 [2]。我也尝试删除%d,但没有运气。请您指出这里出了什么问题。

【问题讨论】:

    标签: python python-3.x pandas datetime string-to-datetime


    【解决方案1】:

    一种方法是将try / exceptpd.Series.apply 一起使用:

    s = pd.Series(['Mar-97', 'May-97', 'Nov-00', '1-Jan', '1-Mar'])
    
    def converter(x):
        try:
            return pd.datetime.strptime(x, '%b-%y')
        except ValueError:
            year, month = x.split('-')  # split by delimiter
            x = year.zfill(2) + '-' + month  # %y requires 0-padding
            return pd.datetime.strptime(x, '%y-%b')
    
    res = s.apply(converter)
    
    print(res)
    
    0   1997-03-01
    1   1997-05-01
    2   2000-11-01
    3   2001-01-01
    4   2001-03-01
    dtype: datetime64[ns]
    

    由于我们已经将converter定义为一个函数,我们可以直接将它与pd.read_csv一起使用:

    df = pd.read_csv('file.csv', parse_dates=['dt_col_name'], date_parser=converter)
    

    Python's strftime directives 是构造datetime 格式字符串的有用参考。

    【讨论】:

      【解决方案2】:

      不是最优雅的,但您可以尝试修复和订购年份和月份部分。以下代码有效:

      重新创建您的数据:

      df = pd.DataFrame({"date_str": ['Mar-97', 'Apr-97', 'May-97', 
                                      'Jun-97', 'Nov-00', 'Dec-00',
                                      '1-Jan', '1-Feb', '1-Mar', '1-Apr']})
      

      拆分部分:

      df = pd.concat([df, df['date_str'].str.split("-", expand=True)], axis=1)
      

      组织月份和年份:

      df.loc[df[0].str.len() == 3, 'month'] = df.loc[df[0].str.len() == 3, 0]
      df.loc[df[1].str.len() == 3, 'month'] = df.loc[df[1].str.len() == 3, 1]
      df.loc[df[0].str.len() != 3, 'year'] = df.loc[df[0].str.len() != 3, 0]
      df.loc[df[1].str.len() != 3, 'year'] = df.loc[df[1].str.len() != 3, 1]
      

      只有一位数的正确年份:

      df.loc[df['year'].str.len() == 1, 'year'] = '0' + df.loc[df['year'].str.len() == 1, 'year']
      

      生成正确的日期列:

      df['date'] = (df['month'] + '-' + df['year']).apply(lambda x: pd.to_datetime(x, format="%b-%y"))
      

      输出:

      打印(df['date'])

      0   1997-03-01
      1   1997-04-01
      2   1997-05-01
      3   1997-06-01
      4   2000-11-01
      5   2000-12-01
      6   2001-01-01
      7   2001-02-01
      8   2001-03-01
      9   2001-04-01
      Name: date, dtype: datetime64[ns]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        • 2019-07-04
        • 1970-01-01
        • 2019-09-15
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多