如何将时间转换成数字?
How to convert time into numbers?
我正在根据实际操作数据对生产调度进行建模。数据为我提供了轮班时间表,如下所示:
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
如果您只需要转换为小时数,只要您的数据按照您指定的方式一致地格式化,这应该可以工作。我假设您的值是作为字符串值读入的:
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]
但是,这再次依赖于数据集的一致性。
NetLogo 有一个时间扩展,它可以完全满足您的需求——除其他外,它创建了一个新的 NetLogo 时间变量类型,它是一个准确的日期和时间,加上一些用于操作和比较时间的原语。它还包括离散事件调度:您可以对您的代理进行编程以在未来时间安排操作。
问题是时间扩展仍在更新和测试中,以包含在未来版本的 NetLogo 中。它的某些部分尚未调试。请务必查看 "issues" 以了解我们所知道的不起作用。
原版在这里:
https://github.com/colinsheppard/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 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
如果您只需要转换为小时数,只要您的数据按照您指定的方式一致地格式化,这应该可以工作。我假设您的值是作为字符串值读入的:
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]
但是,这再次依赖于数据集的一致性。
NetLogo 有一个时间扩展,它可以完全满足您的需求——除其他外,它创建了一个新的 NetLogo 时间变量类型,它是一个准确的日期和时间,加上一些用于操作和比较时间的原语。它还包括离散事件调度:您可以对您的代理进行编程以在未来时间安排操作。
问题是时间扩展仍在更新和测试中,以包含在未来版本的 NetLogo 中。它的某些部分尚未调试。请务必查看 "issues" 以了解我们所知道的不起作用。
原版在这里: https://github.com/colinsheppard/time 但是它的离散事件模拟在新版本的NetLogo中不起作用。