
У меня есть файл с разделителями-запятыми, который включает два столбца: дата/время (который импортируется как mm/dd/yyyy hh:mm
пользовательский формат Excel) и статус 1 или 0. Статус представляет часть оборудования, которая либо включена, либо выключена. Я пытаюсь создать график, который покажет часы вверх или вниз по дням.
УЧИТЫВАТЬ:
1/1/2012 00:00, 1
1/1/2012 03:00, 0
1/1/2012 14:00, 1
1/3/2012 00:00, 0
Это говорит мне, что оборудование работало три часа, простаивало одиннадцать часов, а затем работало тридцать четыре часа (в течение двух календарных дней). Однако я хотел бы создать график, который показывает, сколько часов В ДЕНЬ мы были в рабочем или нерабочем состоянии.
УЧИТЫВАТЬ:
1/1 XXXXXXXXXXXXX----------- (up 13, down 11)
1/2 XXXXXXXXXXXXXXXXXXXXXXXX (up 24)
Мне кажется, что мне нужно сгенерировать набор данных, суммирующий ЧАСЫ по СТАТУСУ по КАЛЕНДАРНОМУ ДНЮ... но я не могу найти разновидность сводной таблицы или вложенной SUM(IF(SUMIF(...)))
комбинации, чтобы это работало.
Наибольшую проблему представляет учет изменений дат... в моем примере выше, поскольку время безотказной работы, начавшееся в 14:00 1/1/2012, пересекает полночь, мне нужно знать, что 10 часов безотказной работы суммируются с 1/1/2012, а 24 часа безотказной работы суммируются с 1/2/2012.
Я, возможно, смогу сделать что-то со списком календаря, чтобы управлять суммированием дат, но тогда мне нужен способ сравнения 01/01/2012
с 01/01/2012 03:00
равными. Должен быть способ по линии, if(INTEGER-PORTIONS-OF-SERIAL-DATES-ARE-EQUAL,TOTAL-HOURS-IF-VALUE-IS_1,0)
но пока ничего не работает.
Есть предложения? Я боролся с этим большую часть дня и мне нужен свежий взгляд.
Спасибо
решение1
OMGBBQ, это сложно! Хотелось бы объяснить это лучше, но, пожалуйста, потерпите меня.
Мое решение требует некоторого дополнительного пространства — 3 столбца, если быть точным — и основано на нескольких предположениях:
- Данные временной метки будут иметь чередующиеся строки единиц и нулей, имитируя переключатель «вкл./выкл.», как вы описали (см. рисунок 1 ниже).
- Временные метки отсортированы от самых старых к самым новым.
Для простоты я использую целые часы. Хотя вы можете добавить временные метки на уровне минут, если хотите.
Столбец Еотслеживает количество часов, оставшихся до конца дня, в каждой временной метке. Я использовал это, чтобы «РАЗДЕЛИТЬ» прошедшее время, которое пересекает полночь.
ВКЛ/ВЫКЛ колонки
Вот формула в столбце ON:
=SUM(IF(AND($B3,A4<>"",INT($A4)=INT($A3)),($A4-$A3)*24,0),
IFERROR(IF(AND($B3=1,INT($A3)<>INT($A4)),$E3,IF(AND($B2=1,INT($A3)<>INT($A2)),24-$E3,0)),0))
Эта формула складывает два значения:
1.Количество часов, в течение которых переключатель находится во включенном положении, если запись не является последней временной меткой за день; в противном случае — 0.
2.Количество оставшихся часовдополночь, если этопоследнийотметка времени дняИЛИколичество прошедших часовсполночь, если этопервыйотметка времени на день.
Формула в столбце OFF аналогична, за исключением того, что она проверяет, равен ли Status = 0.
=SUM(IF(AND(NOT($B3),B4<>"",INT($A4)=INT($A3)),($A4-$A3)*24,0),
IFERROR(IF(AND($B3=0,INT($A3)<>INT($A4)),$E3,IF(AND($B2=0,INT($A3)<>INT($A2)),24-$E3,0)),$B3*($A3-INT($A3))*24))
Чтобы извлечь ДАТУ из столбца временной метки, я использовал функцию INT()
. Excel использует целые числа для представления дат и десятичные числа для представления времени (доли дня или 24 часов). Например, 06/01/2012 18:00
равно 41061.75
(18 часов после полуночи равно 18/24, что равно 0,75).Я думаю, это ответ на ваш последний абзац.
Объединение часов
Вот формула вЧасы работыстолбец (см. изображение ниже). Это формула массива, поэтому вам нужно ввести ее с помощью Ctrl+ Shift+ Enterи затем скопировать ее вниз:
=SUM((INT(stamps)=$G3)*hours_on)
вЧасы ВЫКЛстолбец:
=SUM((INT(stamps)=$G3)*hours_off)
где
stamps
— именованный диапазон, ссылающийся наОтметка временидиапазон (столбецАв моем примере)
hours_on
— это именованный диапазон, ссылающийся наНАдиапазон (столбецС)
hours off
— это именованный диапазон, ссылающийся наВЫКЛЮЧЕННЫЙдиапазон (столбецД)
Диаграмма
Обратите внимание, что для каждой даты сумма часов «ВКЛ» и «ВЫКЛ» составляет 24.
Если вы хотите изучить формулы и рабочую тетрадь, вот копия:http://db.tt/KZgH7SFV
решение2
Предполагая, что у вас есть временные метки в A3:A24 и статус в B3:B24, как предложил Kaze, тогда вы можете получить [десятичные] часы ON
для даты в D3 с помощью этой формулы
=(LOOKUP(D3+1,A$3:B$24)-SUMPRODUCT((INT(A$3:A$24)=D3)+0,MOD(A$3:A$24,1),B$3:B$24*2-1))*24
никаких «вспомогательных» столбцов не требуется....
решение3
Это некрасиво, но вот решение:
После двух столбцов добавьте третий столбец, определенный как day([datecolumn])
A B C D
---------------------
1 | 1/1/2012 00:00, 1, 1
2 | 1/1/2012 03:00, 0, 1
3 | 1/1/2012 14:00, 1, 1
4 | 1/3/2012 00:00, 0, 3
...
99| 1/31/2012 11:23, 1,31
Затем вы можете сделать столбцы сумм, определенные как
sumif(D1:D99, 1, C1:C99)
Что, в приведенном выше случае, покажет вам сумму единиц только тогда, когда столбец D (ранее определенный как часть «День» даты и времени) равен 1. Повторите эту формулу для каждого дня месяца (часть, которая мне не так уж и нравится), и у вас должны быть нужные значения.
Сумма часов на 1-е число месяца
sumif(D1:D99, 1, C1:C99)
Сумма часов на 2-е число месяца
sumif(D1:D99, 2, C1:C99)
Сумма часов на 3-е число месяца
sumif(D1:D99, 3, C1:C99)
и так далее...