Time 如何将时间转换成数字?

Time 如何将时间转换成数字?,time,netlogo,Time,Netlogo,我正在根据实际操作数据对生产计划进行建模。这些数据为我提供了如下所示的轮班时间表: 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

我正在根据实际操作数据对生产计划进行建模。这些数据为我提供了如下所示的轮班时间表:

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函数中读取的好格式。如何将时间格式自动更改为数字,如下所示:

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

如果您只需要转换为小时数,只要您的数据以您指定的方式一致地格式化,就应该可以工作。我假设您的值被读取为字符串值:

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]
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]"
[170 320 440 551 670 851]
[240 420 550 550 850 160]
请注意,这不适用于从一天开始到下一天结束的任何班次

编辑:只要保持一致,您应该能够根据需要调整格式。此修改版本将读取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: [10 240 480 660 810 1110]
observer: [240 360 660 810 1020 1410]
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]"
[170 320 440 551 670 851]
[240 420 550 550 850 160]
编辑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
输出:

observer: [10 240 480 660 810 1110]
observer: [240 360 660 810 1020 1410]
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]"
[170 320 440 551 670 851]
[240 420 550 550 850 160]

然而,这同样依赖于数据集中的一致性

NetLogo有一个时间扩展,它可以完全满足您的需要—除其他外,它创建了一个新的NetLogo时间变量类型,它是一个精确的日期和时间,加上许多用于操作和比较时间的原语。它还包括离散事件调度:您可以对代理进行编程,以便在将来安排操作

问题是,时间延长仍在更新和测试中,以便包含在未来版本的NetLogo中。它的某些部分尚未调试。一定要看看这些问题,看看我们知道哪些是不起作用的

原文如下: 但它的离散事件模拟在新版NetLogo中不起作用

开发版本如下:

谢谢。实际上,我发现系统中的时间数据有另一种格式,请参见我的编辑。这可以转换吗?@Jack-在上面的编辑中,修改后的reporter应该可以,只要它是作为字符串读入的。1。如何使Netlogo以字符串形式读取数字?我正在使用csv扩展读取所有数据,请参见上面编辑的我的源数据格式。2.你能保留我需要的早期解决方案吗?@Jack-看看我答案第二次编辑中的一个选项。