问题描述
我想对一些时间序列数据进行下采样,以获取每个季度的最后一个值:
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”关键字一起使用,但实际上会失败-熊猫报告挂起的错误报告。这不只是问题。
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,**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,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