Как можно получить среднее число столбцов, проиндексированных по дате и времени, которые находятся внутри словаря данных? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть 7 наборов данных от разных датчиков, которые регистрировали данные каждые 30 минут с июня / 2017 по май / 2018. Я выполнил несколько расчетов для каждого, и теперь я хочу получить одну усредненную серию. Каждая серия не имеет одинакового размера, есть некоторые пробелы и измерения, которые начались или закончились раньше / позже в одной, но не в других. Поэтому я хотел бы иметь среднее значение каждой конкретной даты и времени для любых данных, которые у меня есть, если только у двух из них есть информация, я хочу, чтобы это среднее значение, если есть только одно, повторило его в новом столбце.

В итоге у меня появился словарь (sfs) с каждым датчиком внутри в виде информационного кадра (sfs ['50 '], sfs ['51'] ....). Этот список я использовал в циклах: датчики= ['50', '51', '52', '53', '54', '56', '58'] # клавиши словаря sfs (количество датчиков)

И Iтребуется только среднее значение «SFD»: sfs [сенсоры] .SFD

Вот как выглядят некоторые данные:

sfs['50'].SFD.head()
Out[406]: 
datetime
2017-05-30 15:30:00    108.3570
2017-05-30 16:00:00    103.2061
2017-05-30 16:30:00    103.5196
2017-05-30 17:00:00     89.0948
2017-05-30 17:30:00     71.2196
Name: SFD, dtype: float64
sfs['50'].SFD.tail()
Out[413]: 
datetime
2018-05-24 10:30:00    57.0931
2018-05-24 11:00:00    58.0127
2018-05-24 11:30:00    62.0369
2018-05-24 12:00:00    67.6476
2018-05-24 12:30:00    72.9600
sfs['53'].SFD.head()
Out[409]: 
datetime
2017-05-30 16:00:00    61.0546
2017-05-30 16:30:00    54.2241
2017-05-30 17:00:00    45.3321
2017-05-30 17:30:01    31.7433
2017-05-30 18:00:01    24.1680
sfs['53'].SFD.tail()
Out[414]: 
datetime
2018-05-24 11:00:01    39.5086
2018-05-24 11:30:01    44.4543
2018-05-24 12:00:00    48.9744
2018-05-24 12:30:01    52.1892
2018-05-24 13:00:01    50.6103
sfs['56'].SFD.head()
Out[408]: 
datetime
2017-08-03 14:30:00    12.6939
2017-08-03 15:00:00     9.9883
2017-08-03 15:30:00     4.9856
2017-08-03 16:00:00     1.6739
2017-08-03 16:30:00     0.2660
sfs['56'].SFD.tail()
Out[415]: 
datetime
2018-05-24 11:30:00    31.6521
2018-05-24 12:00:00    33.9017
2018-05-24 12:30:00    37.2533
2018-05-24 13:00:00    37.0519
2018-05-24 13:30:00    36.7118

Я думал об использовании groupby, но он не работает в dict. Попытка принудительного суммирования и деления, но я получаю много NAN из-за пробелов, например: (sfs ['50 ']. SFD + sfs ['51']. SFD) / 2

Итак, ожидаемыйдолжен иметь серию с усредненными значениями SFD с учетом минут в дате и времени. Таким образом, если измерение выполняется в 2018-05-24 12:30:01, его можно усреднить с 2018-05-24 12:30:00. Также, когда есть только одна дата и время с мерой, их можно просто скопировать в усредненный ряд (вместо того, чтобы стать NAN).

Большое спасибо!

1 Ответ

2 голосов
/ 03 октября 2019

Я предлагаю объединить все кадры данных с помощью pd.concat после добавления столбца в каждом из них, обозначающего идентификатор датчика. Тогда вы можете использовать любой метод данных, включая groupby:

data = pd.concat([df.assign(sensor_id=key) for key, df in sfs.items()], axis=0, sort=False)

# Then for example for global average:
sensor_averages = data.groupby(sensor_id).mean()
# For daily averages
daily_averages = data.groupby(pd.Grouper(freq="D")).mean()

Помогает ли это?

...