当我在 R 中舍入时间时,为什么某些日期时间值会被删除?
Why are some datetime values being deleted when I round the time in R?
我正在将一系列 csv 文件导入 R。这些文件包含 date/time 列、id 和两列温度值。
这将给出数据的示例:
id<-c(1,2,3,4)
date.time<-as.character(c("12/03/17 00:21:28", "12/03/17 02:21:28", "12/03/17 04:21:28", "12/03/17 06:21:28"))
temp1<-c(-3.568,-3.568,-3.598,-3.598)
temp2<-c(-11.577,-11.577,-11.541,-11.433)
df<-data.frame(id,date.time,temp1,temp2)
因为 date/time 不是我想要的格式,所以我一直在使用 strptime 并将它们格式化为 POSIXlt。
喜欢:
df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
这工作正常并提供如下数据:
id date.time temp1 temp2
1 2017-03-12 0:21:28 -3.568 -11.577
2 2017-03-12 2:21:28 -3.568 -11.577
3 2017-03-12 4:21:28 -3.598 -11.541
4 2017-03-12 6:21:28 -3.598 -11.433
但是,我想将 date.time 列的时间部分四舍五入到最接近的小时。我一直在使用:
df$date.time<-round(df$date.time, units="hours")
这在 99% 的时间里工作得很好。但是,在某些文件中,R 正在删除 date.time 值,看似随机,并给出 NA。每个文件中只有一两个值被删除,我看不出有任何理由删除这些特定值。例如:
id date.time temp1 temp2
1 2017-03-12 0:00:00 -3.568 -11.577
2 NA -3.568 -11.577
3 2017-03-12 4:00:00 -3.598 -11.541
4 2017-03-12 6:00:00 -3.598 -11.433
根据我的阅读,date/time 值可能很挑剔,但这似乎是随机的。
有谁知道可能导致此问题的原因以及是否有更好的方法来舍入 POSIXlt 值的时间部分?
更新:好像只有3月12日凌晨2点被删除了。因此,许多应该四舍五入到 2017-03-12 02:00:00 的时间都被 NAs 代替了。但这不会发生在所有的 csv 文件中,只有大约一半。为什么 R 在读取这个特定日期时遇到问题?
谢谢!
不为 strptime
添加时区会破坏您的字符串。
让我们看看 df$date.time
的 head
。 Missing/different 个时区。
head(df$date.time)
[1] "2017-03-12 00:21:28 PST"
[2] "2017-03-12 02:21:28"
[3] "2017-03-12 04:21:28 PDT"
[4] "2017-03-12 06:21:28 PDT"
通过将 tz="GMT0"
添加到您的 strptime
函数中,您应该会得到想要的结果。
df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S", tz="GMT0")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
df$date.time<-round(df$date.time, units="hours")
> head(df$date.time)
[1] "2017-03-12 00:00:00 GMT"
[2] "2017-03-12 02:00:00 GMT"
[3] "2017-03-12 04:00:00 GMT"
[4] "2017-03-12 06:00:00 GMT"
我最喜欢的从字符串转换日期的方法是使用 lubridate
包。您可以将 strtime
和 as.POSIXlt
行替换为
library(lubridate)
df$date.time = dmy_hms(df$date.time)
然后像这样四舍五入到小时数:
df$date = round_date(df$date.time, "hour")
我正在将一系列 csv 文件导入 R。这些文件包含 date/time 列、id 和两列温度值。
这将给出数据的示例:
id<-c(1,2,3,4)
date.time<-as.character(c("12/03/17 00:21:28", "12/03/17 02:21:28", "12/03/17 04:21:28", "12/03/17 06:21:28"))
temp1<-c(-3.568,-3.568,-3.598,-3.598)
temp2<-c(-11.577,-11.577,-11.541,-11.433)
df<-data.frame(id,date.time,temp1,temp2)
因为 date/time 不是我想要的格式,所以我一直在使用 strptime 并将它们格式化为 POSIXlt。
喜欢:
df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
这工作正常并提供如下数据:
id date.time temp1 temp2
1 2017-03-12 0:21:28 -3.568 -11.577
2 2017-03-12 2:21:28 -3.568 -11.577
3 2017-03-12 4:21:28 -3.598 -11.541
4 2017-03-12 6:21:28 -3.598 -11.433
但是,我想将 date.time 列的时间部分四舍五入到最接近的小时。我一直在使用:
df$date.time<-round(df$date.time, units="hours")
这在 99% 的时间里工作得很好。但是,在某些文件中,R 正在删除 date.time 值,看似随机,并给出 NA。每个文件中只有一两个值被删除,我看不出有任何理由删除这些特定值。例如:
id date.time temp1 temp2
1 2017-03-12 0:00:00 -3.568 -11.577
2 NA -3.568 -11.577
3 2017-03-12 4:00:00 -3.598 -11.541
4 2017-03-12 6:00:00 -3.598 -11.433
根据我的阅读,date/time 值可能很挑剔,但这似乎是随机的。
有谁知道可能导致此问题的原因以及是否有更好的方法来舍入 POSIXlt 值的时间部分?
更新:好像只有3月12日凌晨2点被删除了。因此,许多应该四舍五入到 2017-03-12 02:00:00 的时间都被 NAs 代替了。但这不会发生在所有的 csv 文件中,只有大约一半。为什么 R 在读取这个特定日期时遇到问题?
谢谢!
不为 strptime
添加时区会破坏您的字符串。
让我们看看 df$date.time
的 head
。 Missing/different 个时区。
head(df$date.time)
[1] "2017-03-12 00:21:28 PST"
[2] "2017-03-12 02:21:28"
[3] "2017-03-12 04:21:28 PDT"
[4] "2017-03-12 06:21:28 PDT"
通过将 tz="GMT0"
添加到您的 strptime
函数中,您应该会得到想要的结果。
df$date.time<-strptime(df$date.time, "%d/%m/%y %H:%M:%S", tz="GMT0")
df$date.time<- as.POSIXlt(df$date.time, "%Y/%m/%d %H:%M:%S", tz="GMT0")
df$date.time<-round(df$date.time, units="hours")
> head(df$date.time)
[1] "2017-03-12 00:00:00 GMT"
[2] "2017-03-12 02:00:00 GMT"
[3] "2017-03-12 04:00:00 GMT"
[4] "2017-03-12 06:00:00 GMT"
我最喜欢的从字符串转换日期的方法是使用 lubridate
包。您可以将 strtime
和 as.POSIXlt
行替换为
library(lubridate)
df$date.time = dmy_hms(df$date.time)
然后像这样四舍五入到小时数:
df$date = round_date(df$date.time, "hour")