重采样数据帧会产生意外的结果



长问题简短,什么是合适的重采样频率/规则? 有时我会得到一个主要填充 NaN 的数据帧,有时效果很好。 我以为我掌握了它。

下面是一个例子,

我正在处理大量数据并更改我的重采样频率,并注意到由于某些重采样规则在每行中仅产生 1 个元素具有值,其余元素具有 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(年:天 #:小时:分钟:秒,注意:足够接近而不冗长(。 尝试每15或30天重新采样也产生了与NaN非常相似的结果。我认为这是由于没有月份的奇数日期格式,但 df.head(( 显示了带有正确日期的索引。

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

  • 源数据帧包含的数据过于详细
  • 您想将采样频率更改为较低的频率,并且 计算例如,从某个数字计算每列的平均值 当前采样周期的源行数。

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

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

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

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

因此,根据您的源数据:

  • 第一行包含2018-01-01(午夜尖锐(的数据。
  • 由于在 00:03:00 和 00:06:00(2018-01-01(,第二行包含只是NaN值。
  • 这同样适用于其他行,截至2018-01-01 23:57:00(这些时间片没有源数据(。
  • 下一行,对于2018-01-02 00:00:00可以填充源数据。
  • 等等。

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