Netlogo - как конвертировать время в числа? - PullRequest
0 голосов
/ 23 апреля 2019

Я моделирую производственное планирование на основе фактических данных операций. Данные предоставляют мне график смен, как показано ниже:

shift_start shift_end
0:10    4:00
4:00    6:00
8:00    11:00
11:00   13:30
13:30   17:00
18:30   23:30

или другой формат:

shift_start shift_end
0100    0400
0400    0600
0800    1100
1100    1330
1330    1700
1830    2330

однако, оба они не являются хорошим форматом для чтения из функции netlogo ticks. Как автоматически изменить формат времени на цифры, как показано ниже:

shift_start shift_end
10     240
240    360
480    660
660    810
810    1020
1110   1410

или в netlogo есть встроенная функция, которая поддерживает считывание времени?

Весь набор данных выглядит следующим образом (пункт 5 - время начала смены, пункт 6 - время окончания) Я читаю весь набор с расширением CSV метод

028W    028W0410    IB  0   1   250 360 0.48    2.78    14.98
028W    028W0800    IB  0   1   480 660 0.54    3.1 18.43
028W    028W1200    IB&OB   0.5 0.5 720 870 0.51    2.58    13.89
028W    028W1430    IB&OB   0.5 0.5 871 910 0.39    2.54    14.83
028W    028W1830    OB  1   0   1110    1410    0.44    2.08    18.08
028W    028W2331    IB&OB   0.5 0.5 1411    240 0.47    2.42    20.25

Ответы [ 2 ]

5 голосов
/ 23 апреля 2019

Существует расширение времени для NetLogo, которое делает именно то, что вам нужно - помимо прочего, оно создает новый тип переменной времени NetLogo, который представляет собой точную дату и время, а также ряд примитивов для манипулирования и сравнения времени.Кроме того, он включает в себя планирование отдельных событий: вы можете запрограммировать своих агентов на планирование действий на будущее.

Проблема заключается в том, что расширение времени все еще обновляется и тестируется для включения в будущую версию NetLogo.Некоторые его части еще не отлажены.Обязательно посмотрите на «проблемы», чтобы увидеть, что, как мы знаем, не работает.

Оригинальная версия здесь: https://github.com/colinsheppard/time, но ее дискретное моделирование событий не работает в новых версиях NetLogo.

Версия для разработки здесь: https://github.com/NetLogo/Time-Extension

3 голосов
/ 23 апреля 2019

Если вам просто нужно преобразовать количество часов, это должно работать, если ваши данные последовательно отформатированы так, как вы указали. Я предполагаю, что ваши значения читаются как строковые значения:

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]

Однако, опять же, это зависит от согласованности в вашем наборе данных.

...