如何在python系列中处理多种日期字符串格式

我有一个要完成操作的csv文件。我创建了一个数据框,其中一个标题为“ start_date”的列具有保修开始日期。我遇到的问题是日期的格式不一致。我想知道从今天的日历日期算起的天数以及该产品保修的开始日期。

此start_date系列中条目的两个示例:

9/11/15
9/11/15 0:00

如何识别每种格式并相应地进行处理?

评论
  • 一手的触碰
    一手的触碰 回复

    不知道这是否会有所帮助,但这是我在excel文件上使用Pandas并希望日期格式为“ mm / dd / yyyy”或其他格式时的工作。

    writer = pd.ExcelWriter(filename, engine='xlsxwriter', datetime_format='mm/dd/yyyy')
    df.to_excel(writer, sheetname)
    

    也许它可以与:     df.to_csv

  • Nicol
    Nicol 回复

    您确实有一些选择。我不完全确定当您尝试直接使用'pd.read_csv'加载文件时会发生什么,但是如上所建议,您可以定义一组格式字符串,您可以尝试使用这些格式字符串来解析数据。

    另一种选择是将date列读为字符串,然后自己解析。如果您希望该列类似于“ YYYY-MM-DD”,则将字符串解析为仅包含该数据,然后将其保存回去,例如。

    import pandas as prandas
    import datetime
    
    df = prandas.read_csv('supa_kewl_data.dis_fmt_rox', dtype={'start_date': str})
    
    print df.head()
    # we are interested in start_date
    
    date_strs = df['start_date'].values
    #YYYY-MM-DD
    #012345678910
    filter_date_strs = [x[0:10] for x in date_strs]
    df['filter_date_strs] = filter_date_strs
    
    # sometimes i've gotten complained at by pandas for doing this
    # try doing df.loc[:,'filter_date_strs'] = filter_date_strs
    # if you get some warning thing
    
    # if you want you can convert back to date time using a 
    dobjs = [datetime.datetime.strptime(x,'%Y-%m-%d') for x in filter_date_strs]
    df['dobj_start_date'] = dobjs
    
    df.to_csv('even_better_data.csv', index=False)
    

    Hopefully this helps! Pandas documentation is sketchy sometimes, looking at the doc in 0.16.2 for read_csv() is intimidating... http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html The library itself is stellar!

  • fet
    fet 回复

    Unfortunately you just have to try each format it might be. If you give an example format, strptime will attempt to parse it for you as discussed here.

    该代码最终看起来像:

    import datetime    
    
    POSSIBLE_DATE_FORMATS = ['%m/%d/%Y', '%Y/%m/%d', etc...] # all the formats the date might be in
    
    for date_format in POSSIBLE_DATE_FORMATS :
        try:
            parsed_date = datetime.strptime(raw_string_date, date_format) # try to get the date
            break # if correct format, don't test any other formats
        except ValueError:
            pass # if incorrect format, keep trying other formats