使用 last 进行下采样时如何获得 NAN

How to get NAN when downsampling with last

我想对一些时间序列数据进行下采样,给我每个季度的最后一个值:

import numpy as np
import pandas as pd

index = pd.date_range(start='2020', freq='M', periods=6)
data = np.ones(6)
data[4:6] = np.nan

datetime
2020-01-31    1.0
2020-02-29    1.0
2020-03-31    1.0
2020-04-30    1.0
2020-05-31    NaN
2020-06-30    NaN
Freq: M, dtype: float64

我的要求是,如果最后一个值是nan,下采样值也应该是nan,而不是段中最后一个非nan值。 从 4/30 开始,这将是 1.0,我们不希望这样。我们想要第二季度的 NAN。

根据文档,您可以将 .last() 与“min_count”关键字一起使用,但实际上失败了 - pandas 待处理的错误报告。那是除了问题。

datetime.resample('Q').last(min_count=3)

TypeError                                 Traceback (most recent call last)
<ipython-input-15-bd5dfd934676> in <module>
----> 1 datetime.resample('Q').last(min_count=3)

~/miniconda3/lib/python3.7/site-packages/pandas/core/resample.py in g(self, _method, *args, **kwargs)
    934 
    935     def g(self, _method=method, *args, **kwargs):
--> 936         nv.validate_resampler_func(_method, args, kwargs)
    937         return self._downsample(_method)
    938 

~/miniconda3/lib/python3.7/site-packages/pandas/compat/numpy/function.py in validate_resampler_func(method, args, kwargs)
    383             )
    384         else:
--> 385             raise TypeError("too many arguments passed in")
    386 
    387 

TypeError: too many arguments passed in

在这个问题解决之前,我怎样才能实现我的目标?

可能会进行增强以解决此问题: Github issue #37768

同时,这里有一个解决方法:

df = pd.DataFrame(datetime,columns =['data'])
df.fillna(1234.56789, inplace=True)  # unique and not in your data
df2 = df.resample('Q').last()
df2['data']=np.where(df2['data']==1234.56789,
                    np.nan,
                    df2['data'])

df2

data
2020-03-31  1.0
2020-06-30  NaN