如何在 R 中为日期添加时间(午夜)并在没有 1 或 2 小时班次的情况下打印它?
Posted
技术标签:
【中文标题】如何在 R 中为日期添加时间(午夜)并在没有 1 或 2 小时班次的情况下打印它?【英文标题】:How to add a time (midnight) to a date in R and print it without a 1 or 2h shift? 【发布时间】:2022-01-02 19:22:31 【问题描述】:我有一个包含日期列的数据框,没有时间。我想将其转换为日期时间格式,使用 00:00:00 作为时间戳。并打印时间。
从这些帖子1、2 和3 中,我了解到R 中的时间格式可能会省略午夜,因此我使用@ACuriousCat 解决方案打印时间。我拥有的更简单的代码是:
data<-c(NA,"2014-03-18","2014-04-01","2014-04-15","2014-04-28","2014-05-14")
> data
[1] NA "2014-03-18" "2014-04-01" "2014-04-15" "2014-04-28" "2014-05-14"
> data1<-format(as.POSIXct(data,tz='UTC'),"%Y-%m-%d %H:%M:%S")
> data1
[1] NA "2014-03-18 00:00:00" "2014-04-01 00:00:00" "2014-04-15 00:00:00" "2014-04-28 00:00:00"
[6] "2014-05-14 00:00:00"
效果很好!但是,在我的真实数据集上,时间将是
> data1
[1] NA "2014-03-18 01:00:00" "2014-04-01 02:00:00" "2014-04-15 02:00:00" "2014-04-28 02:00:00"
[6] "2014-05-14 02:00:00"
我的数据在 R 中读取或编码的方式看起来像是时区问题 + 夏令时问题。但我该如何解决呢?我尝试了不同的时区,它没有用。到目前为止,我能做的就是:
> data1<-format(as.POSIXct(as_datetime(as.double(as.POSIXct(data)+3600)-3600),tz='UTC'),"%Y-%m-%d %H:%M:%S")
> data1
[1] NA "2014-03-18 00:00:00" "2014-04-01 00:00:00" "2014-04-15 00:00:00" "2014-04-28 00:00:00"
[6] "2014-05-14 00:00:00"
有没有更简单的编码方式?
【问题讨论】:
尝试将tz='UTC'
也添加到format
调用中。
感谢您的建议。我试过了,还是不行。
我第一次编码错了,但是是的,这实际上很好地解决了它!谢谢(如果你想让它成为一个答案,我会接受它)。
【参考方案1】:
似乎在您的手动检查和采样中,您将日期作为字符串,而在您的真实数据表/框架上出现问题的地方,您可能将日期作为日期列(使用另一个 TZ 集)。
这里用date(字符)和dates2(as.Date)来说明
data <- data.table(
dates = c(NA,"2014-03-18","2014-04-01","2014-04-15","2014-04-28","2014-05-14")
)
data[, dates2 := as.Date(dates)]
data[, datetime := format(as.POSIXct(dates, tz = "UTC"), "%m-%d-%Y %H:%M:%S")]
data[, datetime2 := format(as.POSIXct(dates2, tz = "UTC"), "%m-%d-%Y %H:%M:%S")]
str(data)
# Classes ‘data.table’ and 'data.frame': 6 obs. of 4 variables:
# $ dates : chr NA "2014-03-18" "2014-04-01" "2014-04-15" ...
# $ dates2 : Date, format: NA "2014-03-18" "2014-04-01" "2014-04-15" ...
# $ datetime : chr NA "03-18-2014 00:00:00" "04-01-2014 00:00:00" "04-15-2014 00:00:00" ...
# $ datetime2: chr NA "03-18-2014 01:00:00" "04-01-2014 02:00:00" "04-15-2014 02:00:00" ...
# - attr(*, ".internal.selfref")=<externalptr>
编辑
如果您使用带有日期的字符列,您可以使用它
data[, dates := as.character(dates)]
data[, datetime := format(as.POSIXct(dates, tz = "UTC"), "%m-%d-%Y %H:%M:%S")]
如果您已将日期转换为日期列,则可以使用它
data[, dates := as.Date(dates)]
data[, datetime := format(as.POSIXct(dates), "%m-%d-%Y %H:%M:%S", tz = "UTC")]
由于格式无论如何返回一个字符串,最好的解决方案实际上是这样的:
data[!is.na(dates), datetime := paste(dates, "00:00:00")]
【讨论】:
谢谢,有帮助!我确实将我的日期设置为 Date 列,并且时区设置为 UTC(使用tz()
进行检查)但是,在您的示例中,datetime 和 datetime2 也是使用 tz = UTC 生成的,所以我很困惑它为什么会产生您的示例中的不同结果。除非as.Dates
改变这一点?
不,这只是为我的示例完成的,我从字符串开始。关键点似乎是当您有日期时,您在格式上使用时区,而如果您使用字符串,则将时区设置为 as.POSIXct。但除了试图理解有趣的行为之外。无论哪种方式,你都会得到一个格式化的字符串,所以最简单的方法实际上是 paste() 解决方案。以上是关于如何在 R 中为日期添加时间(午夜)并在没有 1 或 2 小时班次的情况下打印它?的主要内容,如果未能解决你的问题,请参考以下文章