首页 > 解决方案 > 重新采样数据框会产生意想不到的结果

问题描述

长问题短,什么是适当的重采样频率/规则?有时我得到一个主要充满 NaN 的数据框,有时它工作得很好。我以为我掌握了它。

下面是一个例子,

我正在处理大量数据并且正在更改我的重采样频率,并注意到由于某些重采样规则在每行中仅产生一个元素具有值,其余元素具有 NaN。

例如,

df = pd.DataFrame()
df['date']=pd.date_range(start='1/1/2018', end='5/08/2018')

创建一些示例数据,

df['data1']=np.random.randint(1, 10, df.shape[0])
df['data2']=np.random.randint(1, 10, df.shape[0])
df['data3'] = np.arange(len(df))

数据看起来像,

print(df.head())
print(df.shape)

            data1  data2  data3
date                           
2018-01-01      7      7      0
2018-01-02      8      8      1
2018-01-03      2      7      2
2018-01-04      2      2      3
2018-01-05      2      5      4
(128, 3)

当我使用偏移别名重新采样数据时,我得到了意想不到的结果。

下面我每 3 分钟重新采样一次数据。

resampled=df.resample('3T').mean()

print(resampled.head())
print(resampled.shape)

                     data1  data2  data3
date                                    
2018-01-01 00:00:00    4.0    5.0    0.0
2018-01-01 00:03:00    NaN    NaN    NaN
2018-01-01 00:06:00    NaN    NaN    NaN
2018-01-01 00:09:00    NaN    NaN    NaN
2018-01-01 00:12:00    NaN    NaN    NaN

除了第一行之外,大多数行都用 NaN 填充。我相信这是因为我的重采样规则没有索引。它是否正确?'24H' 是此数据的最小间隔,但任何少的东西都会使 NaN 保持连续。

可以对数据帧重新采样小于日期时间分辨率的增量吗?

过去我在尝试重新采样跨越一年的大型数据集时遇到了麻烦,日期时间索引格式为 %Y:%j:%H:%M:%S (year:day #: hour: minute:second,注意:足够接近而不是冗长)。尝试每 15 或 30 天重新采样一次也产生了与 NaN 非常相似的结果。我认为这是由于没有月份的奇怪日期格式,但 df.head() 显示了正确日期的索引。

标签: pythonpandasdataframe

解决方案


当您重新采样降低频率(下采样)时,计算结果的可能选项之一就是mean()。它实际上意味着:

  • 源 DataFrame 包含过于详细的数据。
  • 您希望将采样频率更改为较低的频率,并计算例如当前采样周期的一些源行中每列的平均值。

但是当您增加采样频率(上采样)时,则:

  • 你的源数据太笼统了
  • 您想将频率更改为更高的频率。
  • 计算结果的可能选项之一是例如 在已知源值之间进行插值。

请注意,当您将每日数据上采样到 3 分钟频率时:

  • 第一行将包含2018-01-01 00:00:002018-01-01 00:03:00之间的数据。
  • 下一行将包含2018-01-01 00:03:002018-01-01 00:06:00之间的数据。
  • 等等。

因此,根据您的源数据:

  • 第一行包含2018年 1月 1 日(午夜尖锐)的数据。
  • 由于00:03:0000:06:00之间的时间范围(在2018-01-01 )没有可用的源数据 ,因此第二行仅包含NaN值。
  • 这同样适用于更多行,直到2018-01-01 23:57:00 (这些时间片没有源数据)。
  • 下一行,对于2018-01-02 00:00:00可以填充源数据。
  • 等等。

这种行为没有什么奇怪的。重采样就是这样工作的。当您实际对源数据进行上采样时,也许您应该插入 缺失值?


推荐阅读