大Pandas周期变化频率及周期指数

2024-09-27 17:54:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一些包含年报信息的股票数据导入熊猫数据框。但年报的结束日期是一个奇数月(1月底),而不是年底。在

years = ['2017-01-31', '2016-01-31', '2015-01-31']
df = pd.DataFrame(data = years, columns = ['years'])

df
Out[357]: 
        years
0  2017-01-31
1  2016-01-31
2  2015-01-31

当我试图添加一个PeriodIndex来显示报表数据有效的时间段时,它默认为12月结束,而不是从日期字符串推断它

^{pr2}$

注意频率应为“A-JAN”。在

我假设这意味着不能从PeriodIndex和我给它的结束日期字符串推断结束日期。在

我可以使用asfreq方法更改它,并使用“A-JAN”作为频率字符串的锚定偏移量anchored offsets。但是,这会改变周期指数中的所有个别期间,而不是单独改变,因为年度的年度报告可能有不同的报告结束日期(如果公司更改了报告期)。在

有没有一种方法可以解释每个日期字符串并正确地为pandas框架中的每一行设置每个句点?在

我的最终目标是设置一个周期列或索引,其频率为“年度”,但期间结束日期设置为“年份”列中相应行的日期。在

**进一步扩展这个问题。考虑到我有许多股票,每只股票都有3-4年的年度财务数据,它们的年度报告频率(或季度报告)的开始和结束日期各不相同。在

Out[14]: 
        years tickers
0  2017-01-31      PG
1  2016-01-31      PG
2  2015-01-31      PG
3  2017-05-31       T
4  2016-05-31       T
5  2015-05-31       T

我试图得到的是一个列,其中包含适当的Period对象,这些对象配置有适当的结束日期(从year列开始),并且都具有年度频率。我想试着重复这些年应用.map或者lambda函数和pd.期间功能。它可能是周期索引不能存在于具有不同结束日期的可变期间对象。有点像

for row in df.years:
    s.append(pd.Period(row, freq='A")
df['period']= s

Tags: 数据对象方法字符串dfoutjan频率
1条回答
网友
1楼 · 发布于 2024-09-27 17:54:09

@KRkirov让我思考。周期构造函数似乎不够聪明,无法通过读取日期字符串来设置频率的结束日期。我可以通过从报告期结束日期开始建立一个锚串来获得频率结束日期,如下所示:

# return a month in 3 letter abbreviation format (eg. "JAN")
df['offset'] = df['years'].dt.strftime('%b').str.upper()

# now build up an anchor offset string (eg. "A-JAN" )
# for quarterly report (eg. "Q-JAN") for q report ending January for year
df['offset_strings'] = "A" + '-' + df.offset

锚串在pandas文档here中有记录。

然后遍历DataFrame的行来构造每个句点并将其放入一个列表中,然后将Period对象的列表(强制转换为PeriodIndex)添加到列中。

^{pr2}$

这将返回一个正确设置了Period对象的正确PeriodIndex:

df['period']
Out[40]: 
0   2017
1   2016
2   2015
Name: period, dtype: object

df['period'][0]
Out[41]: Period('2017', 'A-JAN')

df.index = df.period

df.index
Out[43]: PeriodIndex(['2017', '2016', '2015'], dtype='period[A-JAN]', 
name='period', freq='A-JAN')

不漂亮,但我找不到别的办法。

相关问题 更多 >

    热门问题