在 Python Pandas 中将带有元素日期标签的年度财政数据元组转换为时间序列
Posted
技术标签:
【中文标题】在 Python Pandas 中将带有元素日期标签的年度财政数据元组转换为时间序列【英文标题】:Munge tuples of yearly fiscal data with element date-labels into a time-series in Python Pandas 【发布时间】:2015-12-07 21:09:47 【问题描述】:我正在尝试将 SQL -> .csv 数据转储平面文件转换为每个公司的时间序列。
对我来说,关键是数据被组织成 4 个季度的年度元组。季度结束日期是在每家公司的第一个元组中给出的财政季度。我需要将数据转换为日历季度的时间序列,但无法弄清楚如何。
如何根据这些数据标签构建日期时间索引?
每个公司总是有相同数量的元组,但可能包含空值。下面的示例数据框行突出显示了具有不同财政年度结束日期的 2 家公司
eps_tuples[300:400]
Name Ticker Field Year Qtr 1 Qtr 2 Qtr 3 Qtr 4 FY
953 Accuray Inc ARAY EPS Year Sep.30 Dec.31 Mar.31 Jun.30 Full Year
943 Accuray Inc ARAY EPS 2012 -0.38 -0.15 -0.21 -0.28 -1.02
944 Accuray Inc ARAY EPS 2013 -0.31 -0.35 -0.42 -0.25 -1.33
945 Accuray Inc ARAY EPS 2014 -0.21 -0.07 -0.06 -0.13 -0.47
946 Accuray Inc ARAY EPS 2015 -0.27 -0.13 -0.04 -0.07 -0.51
947 Accuray Inc ARAY EPS 2016 -0.12
960 Accuride Corp ACW EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
961 Accuride Corp ACW EPS 2012 -0.06 -0.02 -0.37 -0.47 -0.92
962 Accuride Corp ACW EPS 2013 -0.31 -0.11 -0.18 0.04 -0.56
963 Accuride Corp ACW EPS 2014 -0.07 0.11 0.02 -0.10 -0.04
964 Accuride Corp ACW EPS 2015 -0.01 0.13 0.04 -0.05 0.11
965 Accuride Corp ACW EPS 2016 0.02 0.11 0.04
我已经开始对 df 进行切片以获得季度日期标签
eps_tuples[eps_tuples['FY']=='Full Year'][42:47]
Name Ticker Field Year Qtr 1 Qtr 2 Qtr 3 Qtr 4 FY
906 ACCO Brands ACCO EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
924 Accretive Healt ACHI EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
942 Accuray Inc ARAY EPS Year Sep.30 Dec.31 Mar.31 Jun.30 Full Year
960 Accuride Corp ACW EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
978 ACE Limited ACE EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
然后我通常会制作一个类似的熊猫日期范围
rng=pd.date_range(end='2016-12-31',freq='Q',periods=20)
我很困惑,因为最多有 20 个句点,可能更少,并且开始和结束是由第一个元组动态定义的,而不是像元组是日历年那样与元组中的位置相关联。
我应该如何进行?
【问题讨论】:
【参考方案1】:您需要根据现有数据创建日期,而不是定义范围。这需要重塑您的数据。不是最好的,但这似乎适用于您的示例数据:
import datetime
ts_dict =
for company in df['Name'].unique():
tmpdf = df[df['Name'] == company][['Year', 'Qtr 1', 'Qtr 2', 'Qtr 3', 'Qtr 4']].reset_index(drop=True)
tmpdf.columns = tmpdf.iloc[0]
tmpdf = tmpdf.drop(0).set_index('Year').unstack().reset_index(name=company)
tmpdf.index = (tmpdf['Year'].apply(str) + tmpdf[0]).apply(lambda x: datetime.datetime.strptime(x, "%Y%b.%d"))
ts_dict[company] = tmpdf[company]
pd.DataFrame.from_dict(ts_dict)
给予
Accuray Inc Accuride Corp
2012-03-31 -0.21 -0.06
2012-06-30 -0.28 -0.02
2012-09-30 -0.38 -0.37
2012-12-31 -0.15 -0.47
2013-03-31 -0.42 -0.31
2013-06-30 -0.25 -0.11
2013-09-30 -0.31 -0.18
2013-12-31 -0.35 0.04
2014-03-31 -0.06 -0.07
2014-06-30 -0.13 0.11
2014-09-30 -0.21 0.02
2014-12-31 -0.07 -0.1
2015-03-31 -0.04 -0.01
2015-06-30 -0.07 0.13
2015-09-30 -0.27 0.04
2015-12-31 -0.13 -0.05
2016-03-31 NaN 0.02
2016-06-30 NaN 0.11
2016-09-30 -0.12 0.04
2016-12-31 NaN NaN
【讨论】:
感谢您对 unstack 以及将年份字段与季度行相结合的帮助。这正是我需要的进一步:我制作了一个 IF 构造,以根据财政年度结束将 FY 转换为日历年。编辑您的答案是否合适,或者我应该添加自己的答案? 很高兴为您提供帮助。如果您的答案扩展了我的答案,请继续并将其添加为另一个答案。以上是关于在 Python Pandas 中将带有元素日期标签的年度财政数据元组转换为时间序列的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中将字符串列转换为日期的有效方法(在 Python 中),但没有时间戳
如何在 pandas python 中将字符串转换为日期时间格式?
在 Python pandas 中将带有 $ 的货币转换为数字