1

我将一系列 csv 文件导入 R。这些文件包含日期/时间列、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)

因为日期/时间不是我想要的格式,所以我一直在使用 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

从我读过的内容来看,日期/时间值可能很挑剔,但这似乎很随机。

有谁知道可能导致此问题的原因以及是否有更好的方法来舍入 POSIXlt 值的时间部分?

更新:似乎唯一被删除的时间是 3 月 12 日凌晨 2 点。因此,许多应该四舍五入到 2017-03-12 02:00:00 的时间都被替换为 NA。但这不会发生在所有的 csv 文件中,只有大约一半。为什么 R 在读取这个特定日期时遇到问题?

谢谢!

4

2 回答 2

1

不添加时区strptime会破坏您的字符串。

让我们看一下headdf$date.time缺少/不同的时区。

 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"
于 2017-09-13T20:25:40.853 回答
1

我最喜欢的从字符串转换日期的方法是使用lubridate包。您可以将您的strtimeas.POSIXlt行替换为

library(lubridate)
df$date.time = dmy_hms(df$date.time)

并将它四舍五入到这样的小时:

df$date = round_date(df$date.time, "hour")
于 2017-09-14T12:05:53.730 回答