Вперед заполнить определенные столбцы с указанной частотой для данных временных рядов - PullRequest
2 голосов
/ 13 апреля 2020

Я хочу переслать заполнить 2 столбца: Time и X в 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 12:12:49.213  12  15  4
4  2020-01-15 14:12:49.213  8   4   3   

, но оставив оставшиеся столбцы Y и Z постоянными, или заполнить дополнительные строки с NaN.

Я проверил Pandas документы для .fillna и .asfreq , но они не покрывали форвардную заливку определенных столбцов. В то время как этот ответ имел, он не указывал частоту.

Ожидаемый результат (с использованием 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 

               ...

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете попробовать asfreq для повторной выборки.

Рабочий процесс:

  • Сначала мы установим столбец Time как индекс
  • Сортировка индекса (если его нет, метод asfreq не будет выполнен)
  • Давайте теперь расширим фрейм данных. Мы выполняем повторную выборку два раза согласно используемому методу:

    • Если метод не предоставлен (например, None), новые значения заполняются NaN. Мы используем это для столбцов Y и Z
    • Для столбца X метод ffill "передает последнее действительное наблюдение вперед до следующего действительного" do c .

    • Как вы отметили в комментариях, важно использовать частоту, чтобы знать, все ли значения будут сохранены. Если частота слишком велика, некоторые значения могут не соответствовать интервалу. В результате эти значения будут пропущены. Чтобы преодолеть это, можно использовать меньший интервал (скажем, 1s). Используя его, ffill будет корректно применен ко всем значениям.

    • Однако, если вам действительно нужен 10S фрейм даты, нам нужно выполнить повторную выборку. Здесь мы начинаем понимать, что, делая это, мы снова удаляем значения, не входящие в диапазон дат. Но это не проблема c, потому что у нас уже есть эти значения (они являются нашим входом). Таким образом, мы можем добавить их к нашему фрейму данных, используя 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]
...