如果确切日期为DNE,pandas asfreq将返回NaN

时间:2014-12-27 23:54:30

标签: python datetime pandas

假设我的财务数据位于pandas.Series,名为fin_series.

点击fin_series

In [565]: fin_series
Out[565]: 
Date
2008-05-16    1000.000000
2008-05-19    1001.651747
2008-05-20    1004.137434
...
2014-12-22    1158.085200
2014-12-23    1150.139126
2014-12-24    1148.934665
Name: Close, Length: 1665

我有兴趣查看数据的季度端点。但是,并非所有的金融交易日都落在本季度的末尾。'

例如:

In [566]: fin_series.asfreq('q')
Out[566]: 
2008-06-30     976.169624
2008-09-30     819.518923
2008-12-31     760.429261
...
2009-06-30     795.768956
2009-09-30     870.467121
2009-12-31     886.329978
...
2011-09-30     963.304679
2011-12-31            NaN
2012-03-31            NaN
....
2012-09-30            NaN
2012-12-31    1095.757137
2013-03-31            NaN
2013-06-30            NaN
...
2014-03-31    1138.548881
2014-06-30    1168.248194
2014-09-30    1147.000073
Freq: Q-DEC, Name: Close, dtype: float64

这是一个完成我喜欢的功能,以及期望的最终结果。

def bmg_qt_asfreq(series):
    ind = series[1:].index.quarter != series[:-1].index.quarter
    ind = numpy.append(ind, True)
    return tmp[ind]

给了我:

In [15]: bmg_asfreq(tmp)
Out[15]: 
Date
2008-06-30     976.169425
2008-09-30     819.517607
2008-12-31     760.428770
... 
2011-09-30     963.252831
2011-12-30     999.742132
2012-03-30    1049.848583
...
2012-09-28    1086.689824
2012-12-31    1093.943357
2013-03-28    1117.111859
Name: Close, dtype: float64

请注意,我保留了"最接近的先前价格的日期,"而不是简单地使用pandas.asfreq(freq = 'q', method = 'ffill'),因为原始Series.Index中存在的日期保留至关重要。

这似乎是一个很愚蠢的问题,许多人已经拥有并且必须通过所有pandas时间操作功能来解决,但我无法弄清楚如何使用resample来解决这个问题。或asfreq.

任何可以向我展示内置pandas功能的人都将非常感激。

此致

1 个答案:

答案 0 :(得分:1)

假设输入是数据帧 Series,首先

import pandas as pd
fin_series.resample("q",pd.Series.last_valid_index)

获取每季度最后一次非NA指数的系列。然后

fin_series.resample("q","last")

表示最后一个非NA值。然后,您可以将它们连接在一起正如您在评论中所建议的那样:

fin_series[fin_series.resample("q",pd.Series.last_valid_index)]