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

时间:2019-01-07 14:20:30

标签: python pandas datetime

我有一个pandas数据框,其中的一列应指示一个财务季度的结束。格式为“ Q1-2009”类型。有没有一种快速的方法可以将这些字符串转换为时间戳为“ 2009-03-31”?

我只发现了“ YYYY-QQ”格式的转换,而没有发现相反的情况。

2 个答案:

答案 0 :(得分: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'))

答案 1 :(得分: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