#python #pandas #dataframe #datetime #nan
Вопрос:
У меня есть фрейм данных, созданный из регистратора данных, где каждая точка данных имеет свою собственную метку времени, которая выглядит следующим образом:
df_orig = pd.DataFrame(
{
"val1": [ 1, np.nan, np.nan, 11, np.nan, np.nan, 21, np.nan, np.nan, ],
"val2": [ np.nan, 2, np.nan, np.nan, 12, np.nan, np.nan, 22, np.nan, ],
"val3": [ np.nan, np.nan, 3, np.nan, np.nan, 13, np.nan, np.nan, 23, ],
},
index=pd.to_datetime( [
"2021-01-01 00:00", "2021-01-01 00:00:01", "2021-01-01 00:00:02",
"2021-01-01 00:01", "2021-01-01 00:01:01", "2021-01-01 00:01:02",
"2021-01-01 00:02", "2021-01-01 00:02:01", "2021-01-01 00:02:02",
] )
)
val1 val2 val3
2021-01-01 00:00:00 1.0 NaN NaN
2021-01-01 00:00:01 NaN 2.0 NaN
2021-01-01 00:00:02 NaN NaN 3.0
2021-01-01 00:01:00 11.0 NaN NaN
2021-01-01 00:01:01 NaN 12.0 NaN
2021-01-01 00:01:02 NaN NaN 13.0
2021-01-01 00:02:00 21.0 NaN NaN
2021-01-01 00:02:01 NaN 22.0 NaN
2021-01-01 00:02:02 NaN NaN 23.0
На самом деле мне не нужна точность того, когда была зарегистрирована каждая отдельная точка данных. Я хотел бы уплотнить фрейм данных, исключив NaN
буквы s и объединив строки, которые находятся очень близко друг к другу. результат должен выглядеть так:
val1 val2 val3
2021-01-01 00:00:00 1 2 3
2021-01-01 00:01:00 11 12 13
2021-01-01 00:02:00 21 22 23
Есть ли способ сделать это?
Ответ №1:
По возможности упростите решение для повторной выборки за минуты с max
min
first
помощью или или:
df = df_orig.resample('Min').max()
print (df)
val1 val2 val3
2021-01-01 00:00:00 1.0 2.0 3.0
2021-01-01 00:01:00 11.0 12.0 13.0
2021-01-01 00:02:00 21.0 22.0 23.0
Комментарии:
1. Спасибо. В моем реальном кадре данных не было такой хорошей частоты между данными, так что повторная выборка привела ко многим-многим строкам, заполненным
NaN
буквами s. Я решил эту проблему, используя эту строку:data = data_orig.resample( "100ms" ).first().dropna( how="all" )
.