【问题标题】:Resampling dataframe is producing unexpected results重新采样数据框会产生意想不到的结果
【发布时间】:2020-01-04 04:45:09
【问题描述】:

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

下面是一个例子,

我正在处理大量数据并且正在更改我的resample 频率,并注意到出于某种原因,某些重采样规则在每行中仅生成 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)

当我使用 offset aliases 重新采样数据时,我得到了意想不到的结果。

下面我每 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 连续出现。

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

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

【问题讨论】:

  • 你所有的日期都有午夜时间段:00:00:00.

标签: python pandas dataframe


【解决方案1】:

当您重新采样降低频率(下采样)时,然后 计算结果的可能选项之一就是 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-01-01 的数据(午夜时分)。
  • 由于在 2 之间的时间范围内没有可用的源数据 00:03:0000:06:00(在 2018-01-01 上),第二行包含 只是 NaN 值。
  • 这同样适用于更多行,直到 2018-01-01 23:57:00 (这些时间片没有源数据)。
  • 下一行,2018-01-02 00:00:00 可以用源数据填充。
  • 等等。

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

【讨论】:

  • 是的,我应该插入我的数据。我需要为 Pandas 做一些阅读。除非您对此有妙语?
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多