如何将日期格式 QQ-YYYY 转换为 datetime 对象

3

我有一个带有表示财务季度结束的列的pandas数据框,格式为"Q1-2009"。是否有一种快速的方法将这些字符串转换为时间戳,例如"2009-03-31"?

我只找到了从格式"YYYY-QQ"转换的方法,但是没有相反的方法。


pd.to_datetime 返回一个 ValueError: ('Unknown string format:', 'Q1-2009')。 - AleB
2个回答

3
使用replace函数交换季度和年份部分,创建季度时间段,并使用PeriodIndex.to_timestamp将其转换为日期时间。
df = pd.DataFrame({'per':['Q1-2009','Q3-2007']})

df['date'] = (pd.PeriodIndex(df['per'].str.replace(r'(Q\d)-(\d+)', r'\2-\1'), freq='Q')
                .to_timestamp(how='e'))

print (df)
       per       date
0  Q1-2009 2009-03-31
1  Q3-2007 2007-09-30

另一个解决方案是使用字符串索引:

df['date'] = (pd.PeriodIndex(df['per'].str[-4:] + df['per'].str[:2], freq='Q')
                .to_timestamp(how='e'))

它运行得非常完美!非常有用。对于这样的格式没有答案。 - AleB

1
使用列表推导式后跟pd.offsets.MonthEnd的一种解决方案:
# data from @jezrael
df = pd.DataFrame({'per':['Q1-2009','Q3-2007']})

def get_values(x):
    ''' Returns string with quarter number multiplied by 3 '''
    return f'{int(x[0][1:])*3}-{x[1]}'

values = [get_values(x.split('-')) for x in df['per']]
df['LastDay'] = pd.to_datetime(values, format='%m-%Y') + pd.offsets.MonthEnd(1)

print(df)

       per    LastDay
0  Q1-2009 2009-03-31
1  Q3-2007 2007-09-30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接