【问题标题】:How to convert time into numbers?如何将时间转换为数字?
【发布时间】:2019-04-23 02:21:33
【问题描述】:

我正在根据实际运营数据对生产调度进行建模。数据为我提供了如下所示的轮班时间表:

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

【问题讨论】:

    标签: time netlogo


    【解决方案1】:

    NetLogo 有一个时间扩展,可以完全满足您的需求——除此之外,它创建了一个新的 NetLogo 时间变量类型,它是一个精确的日期和时间,以及一些用于操作和比较时间的原语。它还包括离散事件调度:您可以对代理进行编程以在未来时间调度操作。

    问题在于时间扩展仍在更新和测试中以包含在 NetLogo 的未来版本中。它的某些部分尚未调试。请务必查看“问题”以了解我们所知道的不起作用。

    原始版本在这里: https://github.com/colinsheppard/time 但它的离散事件模拟在新版本的 NetLogo 中不起作用。

    开发版在这里: https://github.com/NetLogo/Time-Extension

    【讨论】:

      【解决方案2】:

      如果您只需要转换为小时数,只要您的数据始终按照您指定的方式进行格式化,这应该可以工作。我假设您的值被作为字符串值读入:

      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]
      

      但是,这又取决于数据集中的一致性。

      【讨论】:

      • 谢谢。我实际上发现来自系统的时间数据有另一种格式(见我的编辑)。可以转换吗?
      • @Jack - 在上面的编辑中修改后的记者应该没问题,只要它作为字符串读入。
      • 1)。如何让 Netlogo 将数字读取为字符串?我正在使用 csv 扩展名读取所有数据(请参阅上面编辑的我的源数据格式)。 2)。你能保留我需要的早期解决方案吗?
      • @Jack - 在我的答案的第二次编辑中查看一个选项。
      猜你喜欢
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多