我有一个由 3 列组成的数据框。我想将日期时间列的格式更改为 POSIXct。但我想不出一种以毫秒为单位的方法。在 POSIXct 中是否可以使用毫秒?我在不同的帖子里看到过
这是我正在使用的数据框的示例:
如果我第一次尝试将格式设置为
format="%Y-%m-%d %H:%M:%OS"
,我会失去毫秒:
#data
df
Datetime Tag Value
1 2023-09-27 00:00:00.032 RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit 1.000000
2 2023-09-27 00:00:00.033 RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit 1.000000
3 2023-09-27 00:00:00.068 SystemTrack_ActivePowerL1 682.399960
4 2023-09-27 00:00:00.075 SystemTrack_ActivePowerL2 573.800000
5 2023-09-27 00:00:00.082 SystemTrack_ActivePowerL3 551.600000
6 2023-09-27 00:00:00.088 SystemTrack_AirPressure 5.426357
7 2023-09-27 00:00:00.094 SystemTrack_CurrentL1 3.577860
8 2023-09-27 00:00:00.102 SystemTrack_CurrentL2 3.161120
9 2023-09-27 00:00:00.102 RobotSignals_RobotIR03L3POSpringLoadingComIn_di_JobNoMirrored 10.000000
10 2023-09-27 00:00:00.108 SystemTrack_CurrentL3 3.389500
#changing the format from charakter to POSIXct
df$Datetime <- as.POSIXct(df$Datetime, format="%Y-%m-%d %H:%M:%OS")
#data without the milliseconds
Datetime Tag Value
1 2023-09-27 00:00:00 RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit 1.000000
2 2023-09-27 00:00:00 RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit 1.000000
3 2023-09-27 00:00:00 SystemTrack_ActivePowerL1 682.399960
4 2023-09-27 00:00:00 SystemTrack_ActivePowerL2 573.800000
5 2023-09-27 00:00:00 SystemTrack_ActivePowerL3 551.600000
6 2023-09-27 00:00:00 SystemTrack_AirPressure 5.426357
7 2023-09-27 00:00:00 SystemTrack_CurrentL1 3.577860
8 2023-09-27 00:00:00 SystemTrack_CurrentL2 3.161120
9 2023-09-27 00:00:00 RobotSignals_RobotIR03L3POSpringLoadingComIn_di_JobNoMirrored 10.000000
10 2023-09-27 00:00:00 SystemTrack_CurrentL3 3.389500
如果我尝试直接跟随 OS 3
format="%Y-%m-%d %H:%M:%OS3"
,值将更改为 NA。
#changing the format from charakter to POSIXct
df$Datetime <- as.POSIXct(df$Datetime, format="%Y-%m-%d %H:%M:%OS3")
#all values changed to NA
Datetime Tag Value
1 <NA> RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit 1.000000
2 <NA> RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit 1.000000
3 <NA> SystemTrack_ActivePowerL1 682.399960
4 <NA> SystemTrack_ActivePowerL2 573.800000
5 <NA> SystemTrack_ActivePowerL3 551.600000
6 <NA> SystemTrack_AirPressure 5.426357
7 <NA> SystemTrack_CurrentL1 3.577860
8 <NA> SystemTrack_CurrentL2 3.161120
9 <NA> RobotSignals_RobotIR03L3POSpringLoadingComIn_di_JobNoMirrored 10.000000
10 <NA> SystemTrack_CurrentL3 3.389500
我在这里做错了什么?
看起来只是你失去了毫秒。它们不会打印,但会被保留。当您计算两个值之间的差异时,您可以看到。从打印输出来看,所有差异似乎都应该为零,但您可以在下面看到这些差异正如您所期望的以毫秒为单位的差异。
dat <- tibble::tribble(
~Datetime, ~Tag, ~Value,
"2023-09-27 00:00:00.032", "RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit", 1.000000,
"2023-09-27 00:00:00.033", "RobotSignals_RobotIR01LoadingUnloadingComIn_di_Lifebit", 1.000000,
"2023-09-27 00:00:00.068", "SystemTrack_ActivePowerL1", 682.399960,
"2023-09-27 00:00:00.075", "SystemTrack_ActivePowerL2", 573.800000,
"2023-09-27 00:00:00.082", "SystemTrack_ActivePowerL3", 551.600000,
"2023-09-27 00:00:00.088", "SystemTrack_AirPressure", 5.426357,
"2023-09-27 00:00:00.094", "SystemTrack_CurrentL1", 3.577860,
"2023-09-27 00:00:00.102", "SystemTrack_CurrentL2", 3.161120,
"2023-09-27 00:00:00.102", "RobotSignals_RobotIR03L3POSpringLoadingComIn_di_JobNoMirrored", 10.000000,
"2023-09-27 00:00:00.108", "SystemTrack_CurrentL3", 3.389500)
dat$Datetime <- as.POSIXlt(dat$Datetime, format="%Y-%m-%d %H:%M:%OS")
round(dat$Datetime[2:10]-dat$Datetime[1:9], 3)
#> Time differences in secs
#> [1] 0.001 0.035 0.007 0.007 0.006 0.006 0.008 0.000 0.006
创建于 2024-03-15,使用 reprex v2.0.2
似乎确实存在一些浮点怪异现象,但如果您四舍五入到其原始精度(如上所述),结果是正确的。