python - 前向填充时间序列数据指定频率的某些列

标签 python pandas numpy time-series fill

我想向前填充 2 列:df 中的 TimeX:

   Time                     X   Y   Z
0  2020-01-15 06:12:49.213  0   0   0
1  2020-01-15 08:12:49.213  1   2   2
2  2020-01-15 10:12:49.213  3   6   9
3  2020-01-15 12:12:49.213  12  15  4
4  2020-01-15 14:12:49.213  8   4   3   

但保持剩余列 YZ 不变,或者用 NaN 填充其他行。

我检查了 Pandas 文档中的 .fillna.asfreq但他们没有涵盖前向填充某些列。同时this answer做了,它没有指定频率。

预期输出(使用10s频率):

    Time                     X   Y   Z
0   2020-01-15 06:12:49.213  0   0   0
1   2020-01-15 06:12:59.213  0   NaN NaN  # forward filled 
2   2020-01-15 06:13:09.213  0   NaN NaN  # forward filled 
               ...
11  2020-01-15 08:12:49.213  1   2   2
12  2020-01-15 08:12:59.213  1   NaN NaN  # forward filled 
13  2020-01-15 08:13:09.213  1   NaN NaN  # forward filled 
               ...
22  2020-01-15 10:12:49.213  3   6   9
23  2020-01-15 10:12:59.213  3   NaN NaN  # forward filled 

               ...

最佳答案

你可以试试asfreq重新采样时间。

工作流程:

  • 首先我们将Time列设置为索引
  • 对索引进行排序(如果没有,asfreq方法会失败)
  • 现在让我们扩展数据框。我们按照使用的方法操作resample两次:

    • 如果未提供任何方法(例如 None),则新值将填充为 NaN。我们将其用于 YZ
    • 对于 X 列,ffill 方法“将上一个有效观察向前传播到下一个有效”doc .

    • 正如您在评论中强调的那样,使用的频率对于了解是否保留所有值非常重要。如果频率太大,某些值可能与间隔不匹配。因此,这些值将被跳过。为了克服这个问题,一个解决方案可能是使用更小的间隔(比方说 1s)。使用它,ffill 将正确应用于所有值。

    • 但是,如果您确实想要一个 10S 日期范围数据帧,我们需要重新采样。在这里,我们开始明白,通过这样做,我们将再次删除不在日期范围内的值。但这不是问题,因为我们已经有了这些值(它们是我们的输入)。所以我们可以使用 append 将它们附加到我们的数据框(这样,我们一定会拥有所有的值)。我们甚至可能有重复项,所以使用 drop_duplicates 删除它们.

完整示例:

# Be sure it's a datetime object
df["Time"] = pd.to_datetime(df["Time"])
print(df)

# Set tme column as index
df.set_index(["Time"], inplace=True)
df = df.sort_index()
print(df)
#                      Time   X   Y  Z
# 0 2020-01-15 06:12:49.213   0   0  0
# 1 2020-01-15 08:12:49.213   1   2  2
# 2 2020-01-15 10:12:49.213   3   6  9
# 3 2020-01-15 11:45:24.213   4   6  9
# 4 2020-01-15 12:12:49.213  12  15  4
# 5 2020-01-15 12:12:22.213  12  15  4
# 6 2020-01-15 14:12:49.213   8   4  3

# Resample
out = df[["Y", "Z"]].asfreq('10S')
out["X"] = df["X"].asfreq('1S', method="ffill").asfreq('10S')

# Reset index
out = out.append(df, sort=True).reset_index().drop_duplicates().reset_index(drop=True)
print(out)
#                         Time   X     Y    Z
# 0    2020-01-15 06:12:49.213   0   0.0  0.0
# 1    2020-01-15 06:12:59.213   0   NaN  NaN
# 2    2020-01-15 06:13:09.213   0   NaN  NaN
# 3    2020-01-15 06:13:19.213   0   NaN  NaN
# 4    2020-01-15 06:13:29.213   0   NaN  NaN
# ...                      ...  ..   ...  ...
# 2878 2020-01-15 14:12:29.213  12   NaN  NaN
# 2879 2020-01-15 14:12:39.213  12   NaN  NaN
# 2880 2020-01-15 14:12:49.213   8   4.0  3.0
# 2881 2020-01-15 11:45:24.213   4   6.0  9.0
# 2882 2020-01-15 12:12:22.213  12  15.0  4.0

# [2883 rows x 4 columns]

关于python - 前向填充时间序列数据指定频率的某些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61187390/

相关文章:

python - 将一维数组转换为 numpy 矩阵

python - 使用 numpy multivariate_normal 随机采样时内存不足

python - 如何使用 Python 创建 Word 文档?

python - Pandas.DataFrame.apply 返回 None 值

python - 模组安全 : Output filter: Failed to read bucket (rc 104): Connection reset by peer

pandas - 如何在 Pandas 中将索引转换为日期时间?

python - 是否有允许在列中查找两个字符串的 python 函数?

python - 在 Python 中的同一点快速评估多个函数

python - 如何使用 Moviepy 和 Pygame 播放 mp4 电影

python - 禁止在 beautifulsoup 中显示 url 警告