Если вам просто нужно преобразовать количество часов, это должно работать, если ваши данные последовательно отформатированы так, как вы указали. Я предполагаю, что ваши значения читаются как строковые значения:
globals [ shift-start shift-end ]
to setup
ca
set shift-start [ "0:10" "4:00" "8:00" "11:00" "13:30" "18:30" ]
set shift-end [ "4:00" "6:00" "11:00" "13:30" "17:00" "23:30" ]
show map convert-to-n-minutes shift-start
show map convert-to-n-minutes shift-end
reset-ticks
end
to-report convert-to-n-minutes [ string ]
let ind position ":" string
let sub1 read-from-string substring string 0 ind
let sub2 read-from-string substring string ( ind + 1) ( length string )
report ( sub1 * 60 ) + sub2
end
Выход:
observer: [10 240 480 660 810 1110]
observer: [240 360 660 810 1020 1410]
Обратите внимание, что это не будет учитывать смены, которые начинаются в один день и заканчиваются в следующий.
Редактировать: Вы должны быть в состоянии приспособить формат при необходимости, если вы последовательны. Эта измененная версия будет иметь формат «00:00» или «0000». Обратите внимание, что ваши значения "0100"
и "0:10"
означают 1 час и 10 минут соответственно.
to setup
ca
let shift-original [ "0:10" "4:00" "8:00" "11:00" "13:30" "18:30" ]
let shift-new [ "0100" "0400" "0800" "1100" "1330" "1830" ]
show word "Original:" shift-original
show word "Parsed: " ( map convert-to-n-minutes shift-original )
print ""
show word "New: " shift-new
show word "Parsed: " map convert-to-n-minutes shift-new
reset-ticks
end
to-report convert-to-n-minutes [ string ]
let ind position ":" string
let sub1 0
let sub2 0
ifelse ind != false [
set sub1 read-from-string substring string 0 ind
set sub2 read-from-string substring string ( ind + 1) ( length string )
] [
set sub1 read-from-string substring string 0 2
set sub2 read-from-string substring string 2 4
]
report ( sub1 * 60 ) + sub2
end
Выход:
observer: "Original:[0:10 4:00 8:00 11:00 13:30 18:30]"
observer: "Parsed: [10 240 480 660 810 1110]"
observer: "New: [0100 0400 0800 1100 1330 1830]"
observer: "Parsed: [60 240 480 660 810 1110]"
Редактировать 2:
Предполагается, что набор данных, подобный тому, который вы показали в отредактированном вопросе:
extensions [ csv ]
globals [ shift-start shift-end ]
to setup
ca
let data csv:from-file "data/timesheet.csv"
set shift-start map [ i -> add-zero ( word item 5 i ) ] data
set shift-end map [ i -> add-zero ( word item 6 i ) ] data
print map convert-to-n-minutes shift-start
print map convert-to-n-minutes shift-end
reset-ticks
end
to-report convert-to-n-minutes [ string ]
let ind position ":" string
let sub1 0
let sub2 0
ifelse ind != false [
set sub1 read-from-string substring string 0 ind
set sub2 read-from-string substring string ( ind + 1) ( length string )
] [
set sub1 read-from-string substring string 0 2
set sub2 read-from-string substring string 2 4
]
report ( sub1 * 60 ) + sub2
end
to-report add-zero [ string ]
if length string >= 4 [
report string
]
report add-zero insert-item 0 string "0"
end
Выход:
[170 320 440 551 670 851]
[240 420 550 550 850 160]
Однако, опять же, это зависит от согласованности в вашем наборе данных.