Python 在pandas中将格式不一致的字符串日期转换为datetime

Python 在pandas中将格式不一致的字符串日期转换为datetime,python,pandas,datetime,Python,Pandas,Datetime,我有一个pandas数据框,其中日期信息是带有月份和年份的字符串: date = ["JUN 17", "JULY 17", "AUG 18", "NOV 19"] 请注意,月份通常以3位数的缩写形式书写,但有时也以6月和7月的整月形式书写 我想将其转换为datetime格式,该格式假定每个日期都在每月的第一天: date = [06-01-2017, 07-01-2017, 08-01-2018, 11-01-2

我有一个pandas数据框,其中日期信息是带有月份和年份的字符串:

date = ["JUN 17", "JULY 17", "AUG 18", "NOV 19"]
请注意,月份通常以3位数的缩写形式书写,但有时也以6月和7月的整月形式书写

我想将其转换为datetime格式,该格式假定每个日期都在每月的第一天:

date = [06-01-2017, 07-01-2017, 08-01-2018, 11-01-2019]
编辑以提供更多信息: 我不确定如何处理两个主要问题:

  • 月份的格式不一致。试图通过仅获取字符串前三个字符的子集来解决此问题
  • 今年只是最后两位数,我们很难确定是2020年,而不会变得非常混乱 我尝试了十几种不同的方法,但都没有成功,最近的尝试如下:

  • 这会出现错误“无法解析位置0处的字符串“JUN”

    ,如果您不确定会显示多少拼写,则字典映射将不起作用。也许您最好的机会是拆分和切片,以便将其规范化为年和月列,然后生成日期

    如果
    date
    是示例中的列表

    date = [d.split() for d in date]
    df = pd.DataFrame([m[:3].lower, '20' + y] for m, y in date],
    # df = pd.DataFrame([[s.split()[0][:3].lower, '20' + s.split()[1]] for s in date],
        columns=['month', 'year'])
    
    然后将映射器传递给
    系列。如中所示替换

    df.month = df.month.replace({'jan': 1, 'feb': 2 ...})
    
    然后从其组件解析日期

    # first cap the date to the first day of the month
    df['day'] = 1
    df = pd.to_datetime(df)
    

    您几乎可以使用
    pandas.to_datetime()
    。但是,您可以不使用字典,而是将日期字符串重新格式化为更标准的格式。如果您将每个日期字符串转换为MMMYY格式(与您所做的非常类似),则可以将
    %b%y“
    传递到
    to_datetime())
    并将字符串转换为日期

    import pandas as pd
    
    date = ["JUN 17", "JULY 17", "AUG 18", "NOV 19"]
    df = pd.DataFrame(date, columns=["Record Month"])
    
    df['date'] = pd.to_datetime(df["Record Month"].str[:3] + df["Record Month"].str[-2:], format='%b%y')
    
    print(df)
    
    生成以下结果:

      Record Date       date
    0      JUN 17 2017-06-01
    1     JULY 17 2017-07-01
    2      AUG 18 2018-08-01
    3      NOV 19 2019-11-01
    

    看起来没有内置的功能。到目前为止你做了什么?具体是什么问题?请参阅。
      Record Date       date
    0      JUN 17 2017-06-01
    1     JULY 17 2017-07-01
    2      AUG 18 2018-08-01
    3      NOV 19 2019-11-01