如何使用 fill_value 对 Pandas 中的 TimeSeries 重新采样?

Posted

技术标签:

【中文标题】如何使用 fill_value 对 Pandas 中的 TimeSeries 重新采样?【英文标题】:How to resample a TimeSeries in pandas with a fill_value? 【发布时间】:2013-05-24 08:32:51 【问题描述】:

我有一个整数 TimeSeries,我想使用 resample() 对其进行下采样。问题是我有一些缺失数据的时期被转换为NaN。由于 pandas 不支持Integer NA values,因此整数被转换为浮点数。

是否可以像使用reindex(fill_value=0) 一样使用fill_value 对缺失数据重新采样TimeSeries?我不希望我的整数转换成浮点数。

>>> dates = (datetime(2013, 1, 1), datetime(2013,1,2), datetime(2013,3,1))
>>> s = Series([1,2,4],index=dates)
>>> s
2013-01-01    1
2013-01-02    2
2013-03-01    4
dtype: int64
>>> s.resample('M', how='sum')
2013-01-31     3
2013-02-28   NaN
2013-03-31     4
Freq: M, dtype: float64

# Desired output (doesn't work)
>>> s.resample('M', how='sum', fill_value=0)
2013-01-31     3
2013-02-28     0
2013-03-31     4
Freq: M, dtype: int64

【问题讨论】:

奇怪的是你的第三个值是 4(索引为 2013-03-01 的那个)。 @waitingkuo 你是对的。修正了复制和粘贴的错字。 【参考方案1】:

你可以定义自己的函数来避免NaN

In [36]: def _sum(x):
   ....:     if len(x) == 0: return 0
   ....:     else: return sum(x)
   ....:     

In [37]: s.resample('M', how=_sum)
Out[37]: 
2013-01-31    3   
2013-02-28    0   
2013-03-31    3   
Freq: M, dtype: int64

【讨论】:

当然,但这只是从 int 转换为 float,然后再转换为 int。我不想通过将整数转换为浮点数来降低任何精度。 我认为将 int 转换为 float 时没有精度问题。 当您关注演员阵容时,我添加了另一种方法,希望对您有所帮助。 我认为这不是真的:int(float(max_int)) == max_int 其中max_int = np.iinfo(np.int64).max 返回False 使用 pandas 0.18.0,现在有一种更简单、更快捷的方法:s.resample('M').sum().fillna(0)

以上是关于如何使用 fill_value 对 Pandas 中的 TimeSeries 重新采样?的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续)并使用fill_value参数为行进行默认填充

pandas 基本操作

pandas基础运算

cupy.full() 方法 fill_value 不能带数组?

2018.03.29 python-pandas 数据透视pivot table / 交叉表crosstab

100天精通Python(数据分析篇)——第66天:Pandas透视表基础+实战案例(pivot_table函数)