Pandas объединить два кадра данных временных рядов на основе временного окна (вырезать / преобразовать / объединить) - PullRequest
0 голосов
/ 24 апреля 2020

Имеет 750k строк df с 15 столбцами и pd.Timestamp как index, называемое ts. Я обрабатываю данные в реальном времени с точностью до миллисекунд почти в реальном времени.

Теперь я хотел бы применить некоторые статистические данные, полученные из более высокого временного разрешения в df_stats, в качестве новых столбцов к большому df. df_stats имеет временное разрешение 1 минуту.

$ df
+----------------+---+---------+
| ts             | A | new_col |
+----------------+---+---------+
| 11:33:11.31234 | 1 | 81      |
+----------------+---+---------+
| 11:33:11.64257 | 2 | 81      |
+----------------+---+---------+
| 11:34:10.12345 | 3 | 60      |
+----------------+---+---------+
$ df_stats
+----------------+----------------+
| ts             | new_col_source |
+----------------+----------------+
| 11:33:00.00000 | 81             |
+----------------+----------------+
| 11:34:00.00000 | 60             |
+----------------+----------------+

В настоящее время у меня есть код ниже, но он неэффективен, потому что он необходим для перебора всех данных.

Мне интересно, не может ли быть более простого решения используя pd.cut, bin или pd.Grouper? Или что-то еще, чтобы объединить временные рамки по двум индексам?

df_stats['ts_timeonly'] = df.index.map(lambda x: x.replace(second=0, microsecond=0))
df['ts_timeonly'] = df.index.map(lambda x: x.replace(second=0, microsecond=0))
df = df.merge(df_stats, on='ts_timeonly', how='left', sort=True, suffixes=['', '_hist']).set_index('ts')

1 Ответ

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

Давайте попробуем что-то новое reindex

df_stats=df_stats.set_index('ts').reindex(df['ts'], method='nearest')
df_stats.index=df.index

df=pd.concat([df,df_stats],axis=1)

Или

df=pd.merge_asof(df, df_stats, on='ts',direction='nearest')
...