Python 如何使用pandas.to“datetime with”;“奇怪”;字符串格式

Python 如何使用pandas.to“datetime with”;“奇怪”;字符串格式,python,pandas,datetime,dataframe,machine-learning,Python,Pandas,Datetime,Dataframe,Machine Learning,我正在尝试使用pandas.to_datetime将pandas数据框的列从字符串类型转换为datetime。 col的值具有以下格式: 2017年第一季度 其中,“Q”是一年中的季度,“17”是2017年 该列中还有null的值(我可以删除日期为空的整行) 我试图解决这个问题,剔除季度,只考虑年度,但我无法以这种方式将16年转换为2016年: df_cpu["Launch_Date"] = [str(x) for x in df_cpu["Launch_Date"]] df_cpu["Laun

我正在尝试使用pandas.to_datetime将pandas数据框的列从字符串类型转换为datetime。 col的值具有以下格式:

2017年第一季度

其中,“Q”是一年中的季度,“17”是2017年

该列中还有null的值(我可以删除日期为空的整行)

我试图解决这个问题,剔除季度,只考虑年度,但我无法以这种方式将16年转换为2016年:

df_cpu["Launch_Date"] = [str(x) for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = [x[3:5] for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = [int(x) for x in df_cpu["Launch_Date"]]
df_cpu["Launch_Date"] = pd.to_datetime(df_cpu["Launch_Date"],    format('%Y'))
即使这样也不行:

df_cpu["Launch_Date"] = pd.to_datetime(df_cpu["Launch_Date"], format('Q*\'%Y'))
因为我得到了这个错误:

ValueError:(“未知字符串格式:”,“Q3'16”)

我应该如何解决这个问题


我希望有以下类型的输出:如果每个示例的值是“Q1'16”,我希望有“01-01-2016”。

您可以
将字符串的第一部分映射到一个值,该值可以在
to_datetime
之后使用,例如:

df_cpu = pd.DataFrame({'Launch_Date':["Q1'17", "Q3'16"]})
dict_Q = {"Q1": '01-01-', "Q3": '07-01-'}

print (pd.to_datetime( df_cpu["Launch_Date"].str[:2].map(dict_Q) #replace Qx by a first of month
                       + df_cpu["Launch_Date"].str[3:])) #get the year independtly

0   2017-01-01
1   2016-07-01
Name: Launch_Date, dtype: datetime64[ns]

别忘了用您想要的正确值添加Q2和Q4 int
dict_Q
,我不擅长日期时间格式转换,但这里有一个解决方案应该可以工作。但我不能说这是最有效的。我将编写一个函数,以您喜欢的格式返回日期时间,在数据帧上使用“apply”方法

请注意,下面的函数假定年份始终为20--,并且输出为字符串。根据需要更改输出数据类型

def new_date(arr):
    if isinstance(arr, str):
        quarter = {'Q1':'01-01-', 'Q2':'04-01-', 'Q3':'07-01-', 'Q4':'10-01-'}
        x, y = arr.split("'")[0], arr.split("'")[1]
        x_new = quarter[x]
        y_new = '20'+y
        return x_new + y_new
    else:
        pass

df_cpu["Launch_Date"] = df_cpu["Launch_Date"].apply(new_date)
还请注意,“is_instance”条件仅用于处理NaN值。如果使用pd.dropna(),则不需要它。

考虑到:

1) 提供的数据:

df_cpu = pd.DataFrame(["Q1'17","Q3'16"], columns=['Launch_Date'])
2) “启动日期”列的长度始终为5

您可以使用将季度添加到每年的第一天:

>> pd.to_datetime(df_cpu.Launch_Date.str[3:5],format='%y') + np.multiply(pd.offsets.QuarterBegin(startingMonth=1), df_cpu.Launch_Date.str[1:2].values.astype(int)-1)
0   2017-01-01
1   2016-07-01
Name: Launch_Date, dtype: datetime64[ns]