代码之家  ›  专栏  ›  技术社区  ›  Ari

在熊猫数据帧中转换日期格式

  •  1
  • Ari  · 技术社区  · 6 年前

    我有一个数据框架,日期列有两种不同的日期格式。

    eg. 1983-11-10 00:00:00 and 10/11/1983

    我希望它们都是相同的类型,如何迭代数据帧的日期列并将日期转换为一种格式?

    2 回复  |  直到 6 年前
        1
  •  0
  •   jezrael    6 年前

    我相信你需要参数 dayfirst=True 在里面 to_datetime :

    df = pd.DataFrame({'Date': {0: '1983-11-10 00:00:00', 1: '10/11/1983'}})
    print (df)
                      Date
    0  1983-11-10 00:00:00
    1           10/11/1983
    
    
    df['Date'] = pd.to_datetime(df.Date, dayfirst=True)
    print (df)
            Date
    0 1983-11-10
    1 1983-11-10
    

    因为:

    df['Date'] = pd.to_datetime(df.Date)
    print (df)
            Date
    0 1983-11-10
    1 1983-10-11
    

    或者您可以指定这两种格式,然后使用 combine_first :

    d1 = pd.to_datetime(df.Date, format='%Y-%m-%d %H:%M:%S', errors='coerce')
    d2 = pd.to_datetime(df.Date, format='%d/%m/%Y', errors='coerce')
    
    df['Date'] = d1.combine_first(d2)
    print (df)
            Date
    0 1983-11-10
    1 1983-11-10
    

    多种格式的通用解决方案:

    from functools import reduce 
    
    def convert_formats_to_datetimes(col, formats):
        out = [pd.to_datetime(col, format=x, errors='coerce') for x in formats]
        return reduce(lambda l,r: pd.Series.combine_first(l,r), out)
    
    formats = ['%Y-%m-%d %H:%M:%S', '%d/%m/%Y']
    df['Date'] = df['Date'].pipe(convert_formats_to_datetimes, formats)
    print (df)
            Date
    0 1983-11-10
    1 1983-11-10
    
        2
  •  0
  •   jpp    6 年前

    我希望它们都是相同的类型,如何迭代 我的数据框的日期列并将日期转换为一种格式?

    您的输入数据不明确:是 10 / 11 11月10日还是10月11日?您需要指定逻辑来确定哪个是合适的。如果要按顺序尝试多种日期格式,则函数很有用:

    def date_apply_formats(s, form_lst):
        s = pd.to_datetime(s, format=form_lst[0], errors='coerce')
        for form in form_lst[1:]:
            s = s.fillna(pd.to_datetime(s, format=form, errors='coerce'))
        return s
    
    df['Date'] = date_apply_formats(df['Date'], ['%Y-%m-%d %H:%M:%S', '%d/%m/%Y'])
    

    优先考虑 form_lst . 该解决方案可以扩展到任意数量的提供格式。