
У меня есть данные, полученные с дождемера, в следующем формате:
Индекс данных Метка времени
1. 0 2020-01-05T00:00:00
2. 0 2020-01-05T01:00:00
3. 1 2020-01-05T01:20:15
4. 0 2020-01-05T02:00:00
5. 1 2020-01-05T02:09:00
6. 1 2020-01-05T02:09:45
7. 1 2020-01-05T02:20:00
8. 1 2020-01-05T02:20:01
9. 0 2020-01-05T03:00:00
Я хотел бы суммировать последовательные данные каждые 30 минут. Что-то вроде следующего:
Индекс данных Метка времени
1. 0 2020-01-05T00:00:00
2. 0 2020-01-05T00:30:00
3. 0 2020-01-05T01:00:00
4. 1 2020-01-05T01:30:00
5. 0 2020-01-05T02:00:00
6. 4 2020-01-05T02:30:00
7. 0 2020-01-05T03:00:00
Я уже получил только 24-часовое время из временной метки и попытался выяснить, будет ли вычитание 2 временных меток меньше 30 минут, по следующей формуле:
=IF(((time)-(time-1))<=0.020833,"ok","not within 30min interval")
Формула Excel, которую я имел в виду, должна была получить что-то вроде функции SUMIFS
, которая суммировала бы все последовательные значения в течение 30-минутного интервала.
Я попытался создать что-то вроде COUNTIF
проверки последовательных данных в течение 30-минутного интервала и попытался разработать функцию a SUMIFS
и a SUMPRODUCT
, но мне трудно связать все воедино и использовать логику.
Спасибо
решение1
Вы можете использовать эту формулу:
=DATEVALUE(SUBSTITUTE(C2,"T"," "))+CEILING.MATH(ROUND(TIMEVALUE(SUBSTITUTE(C2,"T"," ")),5),"0:30")
Разбито на шаги:
Чтобы Excel распознавал текст как дату/время, удалите T:
=ПОДСТАВИТЬ(C2;"T"; ")
Чтобы получить дату из этой даты/времени:
=ДАТАЗНАЧЕНИЕ(D2)
Чтобы узнать время для этой даты/времени:
=ОКРУГЛ(ВРЕМЯЗНАЧЕНИЕ(D2),5)
(Чуть ниже я объясню, зачем здесь нужен ROUND)
Чтобы рассчитать следующий 30-минутный интервал:
=ПОТОЛОК.МАТ(ОКРУГЛ(ЗНАЧЕНИЕВРЕМЕНИ(ПОДСТАВИТЬ(C2;"T"," ")),5),"0:30")
Затем объединение даты с 30-минутным шагом дает вам формулу в верхней части ответа. Затем вы можете повернуть таблицу, чтобы просуммировать значение по шагу.
Примечание по вызову ROUND на шаге 3:
Когда я впервые написал формулу, я не использовал ОКРУГЛ на шаге 3, но обнаружил, что приращение, выходящее для 2:00:00, было 2:30:00, что было неправильно. При проверке я обнаружил, что функция ВРЕМЗНАЧ не возвращала правильный уровень точности. Округление до 5 десятичных знаков исправило это.
РЕДАКТИРОВАТЬ:
Поскольку у вас Excel 365, я предполагаю, что у вас также есть доступ к функции ПОСЛЕДОВАТЕЛЬНОСТЬ.
Чтобы выполнить агрегацию без сводной таблицы, вы можете сделать следующее (при условии, что у вас нет готового списка приращений):
- Рассчитайте количество 30-минутных интервалов между MIN TimestampGroup и MAX группой временных меток.
- Создайте последовательность, содержащую столько приращений (чтобы приращения, отсутствующие в исходных данных, также были представлены)
- Используйте функцию SUMIF, чтобы вернуться к исходным данным и суммировать данные по TimestampGroup.
- При желании можно создать GroupIndex для агрегированной таблицы.
Формулы в сводной таблице следующие:
GroupIndex:
=SEQUENCE((MAX($D$3:$D$11)-MIN($D$3:$D$11))*48+1)
Это просто сообщает вам, сколько 30-минутных интервалов существует между наименьшей TimestampGroup и наибольшей TimestampGroup, и возвращает целочисленную последовательность для этого количества интервалов.
Группа временной метки:
=SEQUENCE((MAX($D$3:$D$11)-MIN($D$3:$D$11))*48+1,1,MIN($D$3:$D$11),1/48)
Снова, используя функцию последовательности, верните список TimestampGroups, но вместо того, чтобы начинать последовательность с 1 и увеличивать на 1, что является третьим и четвертым параметрами по умолчанию, начните последовательность с минимальной TimestampGroup и увеличивайте на 30 минут, что составляет 1/48 дня.
Ценить:
=SUMIF($D$3:$D$11,$F16,$B$3:$B$11)
Суммируйте столбец «Данные» для строк, указанных TimestampGroup в текущей строке агрегированной таблицы.