Вы можете concat
два DataFrames
, interpolate
, затем reindex
на DataFrame
вы хотите.
Я предполагаю, что у нас есть определенное количество DataFrames
, где Date
- это DateTimeIndex
во всех них. Я буду использовать два в этом примере, так как вы использовали два вопроса, но код будет работать для любого числа.
df_a
:
Volume Value
Date
2014-01-04 06:00:02 6062 108000
2014-01-04 06:06:05 6062 107200
2014-01-04 06:12:07 6062 97400
2014-01-04 06:18:10 6062 99200
2014-01-04 06:24:12 6062 91300
2014-01-04 06:30:14 6062 84100
2014-01-04 06:36:17 6062 57000
df_b
:
Volume Value
Date
2014-01-04 05:52:50 6062 4.7
2014-01-04 05:58:53 6062 4.7
2014-01-04 06:04:56 6062 4.9
2014-01-04 06:10:58 6062 5.1
2014-01-04 06:17:01 6062 5.2
2014-01-04 06:23:03 6062 5.2
2014-01-04 06:29:05 6062 5.5
2014-01-04 06:35:08 6062 5.5
И вложу их в dict
для примера. Вы читаете их непосредственно в dict
, поэтому вам не нужно делать этот шаг. Я просто хочу показать, как отформатирован мой пример dict
. dict
keys
не имеет значения, любой действительный dict
key
будет работать:
dataList = {'a': df_a,
'b': df_b}
Это возвращает нас туда, где вы сейчас находитесь, с моей dataList
надеюсь, имея один и тот же формат, как и ваша.
Первое, что вам нужно сделать, это объединить DataFrames
. Я использую dict
keys
как имена столбцов MultiIndex
, поэтому вы можете отслеживать, какой экземпляр данного столбца пришел, из которого DataFrame
. Вы можете сделать это следующим образом:
df = pd.concat(dataList.values(), axis=1, keys=dataList.keys())
Это дает вам DataFrame
так:
a b
Volume Value Volume Value
Date
2014-01-04 05:52:50 NaN NaN 6062 4.7
2014-01-04 05:58:53 NaN NaN 6062 4.7
2014-01-04 06:00:02 6062 108000 NaN NaN
2014-01-04 06:04:56 NaN NaN 6062 4.9
2014-01-04 06:06:05 6062 107200 NaN NaN
2014-01-04 06:10:58 NaN NaN 6062 5.1
2014-01-04 06:12:07 6062 97400 NaN NaN
2014-01-04 06:17:01 NaN NaN 6062 5.2
2014-01-04 06:18:10 6062 99200 NaN NaN
2014-01-04 06:23:03 NaN NaN 6062 5.2
2014-01-04 06:24:12 6062 91300 NaN NaN
2014-01-04 06:29:05 NaN NaN 6062 5.5
2014-01-04 06:30:14 6062 84100 NaN NaN
2014-01-04 06:35:08 NaN NaN 6062 5.5
2014-01-04 06:36:17 6062 57000 NaN NaN
Далее необходимо интерполировать для заполнения недостающих значений.Я интерполирую с использованием 'time'
mode
так правильно обрабатывает временные индексы:
df = df.interpolate('time')
Это дает вам DataFrame
так:
a b
Volume Value Volume Value
Date
2014-01-04 05:52:50 NaN NaN 6062 4.700000
2014-01-04 05:58:53 NaN NaN 6062 4.700000
2014-01-04 06:00:02 6062 108000.000000 6062 4.738017
2014-01-04 06:04:56 6062 107352.066116 6062 4.900000
2014-01-04 06:06:05 6062 107200.000000 6062 4.938122
2014-01-04 06:10:58 6062 99267.955801 6062 5.100000
2014-01-04 06:12:07 6062 97400.000000 6062 5.119008
2014-01-04 06:17:01 6062 98857.851240 6062 5.200000
2014-01-04 06:18:10 6062 99200.000000 6062 5.200000
2014-01-04 06:23:03 6062 92805.801105 6062 5.200000
2014-01-04 06:24:12 6062 91300.000000 6062 5.257182
2014-01-04 06:29:05 6062 85472.375691 6062 5.500000
2014-01-04 06:30:14 6062 84100.000000 6062 5.500000
2014-01-04 06:35:08 6062 62151.239669 6062 5.500000
2014-01-04 06:36:17 6062 57000.000000 6062 5.500000
Я думаю, что в целом было бы лучше остановиться здесь, так как вы держите все данные из всех csv
файлов. Но вы сказали, что хотите только моменты времени от самого длинного csv
. Чтобы получить это, вам нужно найти самый длинный DataFrame
, а затем получить строки, соответствующие его индексам. Найти самый длинный DataFrame
легко, вы просто найдете ту, которая имеет максимальную длину. Сохранение только временных моментов в том, что index
также легко, вы просто нарезаете его, используя index
(вы используете метод loc
для нарезки таким образом).
longind = max(dataList.values(), key=len).index
df = df.loc[longind]
Это дает следующее окончательное DataFrame
:
a b
Volume Value Volume Value
Date
2014-01-04 05:52:50 NaN NaN 6062 4.7
2014-01-04 05:58:53 NaN NaN 6062 4.7
2014-01-04 06:04:56 6062 107352.066116 6062 4.9
2014-01-04 06:10:58 6062 99267.955801 6062 5.1
2014-01-04 06:17:01 6062 98857.851240 6062 5.2
2014-01-04 06:23:03 6062 92805.801105 6062 5.2
2014-01-04 06:29:05 6062 85472.375691 6062 5.5
2014-01-04 06:35:08 6062 62151.239669 6062 5.5
Это могут быть объединены в одну строку, если вы хотите:
df = pd.concat(dataList.values(), axis=1, keys=dataList.keys()).interpolate('time').loc[max(dataList.values(), key=len).index]
Или, возможно, немного более четкие 4 линии:
names = dataList.keys()
dfs = dataList.values()
longind = max(dfs, key=len).index
df = pd.concat(dfs, axis=1, keys=names).interpolate('time').loc[longind]
Я не уверен, почему мои окончательные результаты отличаются от того, что вы показываете. Я сам выполнил ваш пример в MATLAB
(R2015A) и получил те же результаты, что и я, поэтому я подозреваю, что вы создали окончательные данные с другим набором данных, чем этот пример.
'append()' или 'concat()'. довольно стандартный, см. документацию. – JohnE
'concat()' не делает resample я думаю. Значения имеют различную выборку времени, которую они должны интерполировать линейным методом. –
Пример, который вы предоставили о том, как вы хотите получить результат, на самом деле не говорит мне, как должны выглядеть данные в конце, не могли бы вы разместить более подробный пример? – firelynx