将 R 中的列格式更改为 POSIXct

问题描述 投票:0回答:1

我有一个由 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

我在这里做错了什么?

r posixct
1个回答
0
投票

看起来只是你失去了毫秒。它们不会打印,但会被保留。当您计算两个值之间的差异时,您可以看到。从打印输出来看,所有差异似乎都应该为零,但您可以在下面看到这些差异正如您所期望的以毫秒为单位的差异。

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

似乎确实存在一些浮点怪异现象,但如果您四舍五入到其原始精度(如上所述),结果是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.