Python 使用时间序列数据的指定频率正向填充某些列

Python 使用时间序列数据的指定频率正向填充某些列,python,pandas,numpy,time-series,fill,Python,Pandas,Numpy,Time Series,Fill,我想在df中向前填充两列:Time和X: 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

我想在
df
中向前填充两列:
Time
X

   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   
但是保持剩余的列
Y
Z
不变,或者用
NaN
填充额外的行

我检查了熊猫的文档,但它们没有涵盖某些列的正向填充。虽然有,但没有指定频率

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

您可以尝试重新采样时间

工作流:

# 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]
  • 首先,我们将
    Time
    列设置为索引
  • 对索引排序(如果没有,则
    asfreq
    方法将失败)
  • 现在让我们扩展数据帧。我们根据使用的方法进行两次重采样:

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

    • 当您在注释中突出显示时,使用的频率对于了解是否将保留所有值非常重要。如果频率太大,某些值可能与间隔不匹配。因此,将跳过这些值。要克服这个问题,一个解决方案可能是使用较小的间隔(比如说
      1s
      )。使用它,
      ffill
      将正确应用于所有值

    • 但是,如果您确实想要一个
      10S
      daterange数据帧,我们需要重新采样。在这里,我们开始理解,通过这样做,我们将再次删除不在daterange中的值。但这没有问题,因为我们已经有了这些值(它们是我们的输入)。因此,我们可以使用将它们附加到数据帧中(这样,我们将确保拥有所有的值)。我们甚至可能有重复的,所以使用删除它们

完整示例:

# 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]

预期的输出是什么?@AlexandreB。请查看编辑后的问题。因此,对于
X
的每个值,您都有一个唯一的时间戳,并且您希望创建新的时间戳
10秒
间隔?@QuangHoang是的,并向前填充
X
列,但保持
Y
Z
完整(用
NaN
填充添加的行),我想是这样的。您可以将索引保留在另一列中。但是,由于
asfreq
正在扩展数据帧,因此索引已更改谢谢您的回答!我有一个问题:我是否仍然可以设置时间限制以应用进一步的操作?例如,我可以计算
0am
4am
之间
时间
数据的平均值吗?是的。这取决于你想做什么。如果只查找特定的日期范围,则可以将数据集子集并应用。但是,如果您要查找所有4h日期范围的摘要,您应该查看一下,顺便说一句,它似乎已删除了原始数据,这些数据不是以
10s
为间隔的-是否可以保留这些原始数据?