【问题标题】:Formatting dates and times with as.POSIXct in R在 R 中使用 as.POSIXct 格式化日期和时间
【发布时间】:2014-10-17 15:18:46
【问题描述】:

我正在尝试使用 R 中的 as.POSIXct 从我的文件“f845”中格式化一列日期和时间(日期时间)。文件 845 在格式化之前有 21 行要跳过,如下面的第一行代码所示,它也有两列和 100000 行。

当我尝试使用下面的第二行代码格式化 datetime 列时,我最终得到的输出如第三行下方的数据所示。

为什么我的代码没有正确格式化日期和时间?

> dat=read.table(f845,sep="\t",skip=21,col.names=c("datetime","light"))
> dat$datetime=as.POSIXct(strptime(dat$datetime,format="%d-%m-%Y %H:%M:%S", tz="UTC"))
> dat[1:10,]
   datetime  time
1      <NA> 4.542
2      <NA> 7.949
3      <NA> 5.678
4      <NA> 7.949
5      <NA> 7.949
6      <NA> 6.813
7      <NA> 2.271
8      <NA> 2.271
9      <NA> 2.271
10     <NA> 2.271

这是格式化前数据的样子:

> dat=read.table(f845,sep="\t",skip=21,col.names=c("datetime","light"))
> dat[1:10,]
              datetime light
1  21/05/2013 22:56:07 4.542
2  21/05/2013 23:01:07 7.949
3  21/05/2013 23:06:07 5.678
4  21/05/2013 23:11:07 7.949
5  21/05/2013 23:16:07 7.949
6  21/05/2013 23:21:07 6.813
7  21/05/2013 23:26:07 2.271
8  21/05/2013 23:31:07 2.271
9  21/05/2013 23:36:07 2.271
10 21/05/2013 23:41:07 2.271

编辑:dput(droplevels (dput(dat[1:10,])) 的输出如下所示,还有大量日期所以我只显示最后几行:

> dput(droplevels(dat[1:10,]))
structure(list(datetime = structure(1:10, .Label = c("21/05/2013 22:56:07", 
"21/05/2013 23:01:07", "21/05/2013 23:06:07", "21/05/2013 23:11:07", 
"21/05/2013 23:16:07", "21/05/2013 23:21:07", "21/05/2013 23:26:07", 
"21/05/2013 23:31:07", "21/05/2013 23:36:07", "21/05/2013 23:41:07"
), class = "factor"), light = c(4.542, 7.949, 5.678, 7.949, 7.949, 
6.813, 2.271, 2.271, 2.271, 2.271)), .Names = c("datetime", "light"
), row.names = c(NA, 10L), class = "data.frame")

【问题讨论】:

  • 试试as.POSIXct(dat$datetime, format="%d/%m/%Y %H:%M:%S") 你用-而不是/
  • 我仍然在所有行中收到“NA”。
  • 你能把dput(dat[1:10,])的输出贴出来
  • 不发布dput() 的完整结果完全违背了目的。看来您正在阅读您的日期时间值作为可能不是您想要的因素。但是请尝试droplevels(dput(dat[1:10,]) 摆脱额外的关卡。
  • 对不起,我的意思是dput(droplevels(dat[1:10,]))。这应该使输出更短,以便您可以发布整个内容。发布部分 dput 永远不会有帮助。见how to make a reproducible example

标签: r posixct


【解决方案1】:

最初的错误可能是由于在format 中使用- 而不是/

 dat <- read.table("D845.lux",sep="\t",skip=21,
        col.names=c("datetime","light"), stringsAsFactors=FALSE)

  dim(dat)
 #[1] 100247      2

  Datetime <- as.POSIXct(dat$datetime, format="%d/%m/%Y %H:%M:%S")
  head(Datetime)
  #[1] "2013-05-21 22:56:07 EDT" "2013-05-21 23:01:07 EDT"
  #[3] "2013-05-21 23:06:07 EDT" "2013-05-21 23:11:07 EDT"
  #[5] "2013-05-21 23:16:07 EDT" "2013-05-21 23:21:07 EDT"

  any(is.na(Datetime))
 #[1] FALSE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多