调整 Pandas 中的每月时间序列数据

Posted

技术标签:

【中文标题】调整 Pandas 中的每月时间序列数据【英文标题】:Adjusting Monthly Time Series Data in Pandas 【发布时间】:2016-07-18 18:29:02 【问题描述】:

我有一个这样的熊猫DataFrame

如您所见,数据对应于月末数据。问题是所有列的月末日期都不相同。 (根本原因是当月的最后一个交易日并不总是与月末重合。)

目前,2016 年 1 月末有两行“2016-01-29”和“2016-01-31”。它应该只有一排。例如,2016 年 1 月结束时,索引 A、索引 B 和索引 C 应该只是 451.1473 1951.218 1401.093。

另一点是,即使每一行几乎总是对应于月末数据,但数据可能不够好,并且可以想象包含随机列的月中数据。在这种情况下,我不想进行任何调整,以便捕获任何先前的数据收集错误。

实现这一目标的最有效方法是什么。

编辑:

            Index A  Index B Index C
DATE                                
2015-03-31  2067.89  1535.07   229.1
2015-04-30  2085.51     1543   229.4
2015-05-29  2107.39      NaN     NaN
2015-05-31      NaN  1550.39   229.1
2015-06-30  2063.11  1534.96     229
2015-07-31  2103.84      NaN   228.8
2015-08-31  1972.18  1464.32     NaN
2015-09-30  1920.03  1416.84   227.5
2015-10-30  2079.36      NaN     NaN
2015-10-31      NaN  1448.39   227.7
2015-11-30  2080.41   1421.6   227.6
2015-12-31  2043.94  1408.33   227.5
2016-01-29  1940.24      NaN     NaN
2016-01-31      NaN  1354.66   227.5
2016-02-29  1932.23  1355.42   227.3

所以,在这种情况下,我需要在 2015-05、2015-10、2016-01 结束时合并行。但是,2015-07 和 2015-08 的行根本没有数据。因此,在这种情况下,我想将 2015-07 和 2015-08 保留为 NaN,而我想在 2015-05、2015-10、2016-01 合并月末行。希望这可以让我更深入地了解我正在尝试做的事情。

【问题讨论】:

【参考方案1】:

你可以使用:

df = df.groupby(pd.TimeGrouper('M')).fillna(method='ffill')
df = df.resample(rule='M', how='last')

创建一个新的DateTimeIndex,在每个月的最后一天结束,并对每个月的最后一个可用数据点进行采样。 fillna() 确保对于最后一个可用日期缺少数据的列,您使用之前的可用值。

【讨论】:

感谢您提供的非常有用的建议。但是,这种方法的问题在于,它将完全删除月中的异常数据。更重要的是,可能存在无法获得月末数据的情况。在这种情况下,我想将其保留为 NaN 而不是用上个月的值填充它。所以,基本上,我只想在几个月的最后几天使用 'fillna' 和 'ffill' 方法。有什么建议吗? 请在您的数据样本中包含您希望考虑的任何案例(并请提供后者以便可以复制,而不是作为图像)。您可能需要使用 groupbyTimeGrouper('M') 来对各个月份的数据进行操作,无论是在循环中还是使用 apply(),具体取决于您要使用多少条件。 我想到的第一件事是每个月循环并决定。但是,我希望有更好的方法。 fillna 和 resample 绝对是一个好的开始。我正在尝试找出选择性应用 fillna 方法的最佳方法。我编辑了这个问题。希望现在更清楚了。 查看编辑,未经测试,但应该可以帮助您入门。棘手的部分是使用.fillna() 决定哪些值保持不变,哪些值要折叠,可能需要一些逻辑。

以上是关于调整 Pandas 中的每月时间序列数据的主要内容,如果未能解决你的问题,请参考以下文章

pandas 重新采样以获得具有时间序列数据的月平均值

Pandas - 在多个时间序列组内插值/插补缺失值

R:时间序列每月最大按组调整

在 pandas 中查找每月某个时间范围内发生的定期付款

Python将每月值插入每日值(线性):Pandas

从 pandas dataFrame 调整 seaborn 图