如何在 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 小时班次的情况下打印它?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在终端中获取当前日期和时间,并在终端中为其设置自定义命令? [关闭]

如何在 postgresql 中为日期添加加号和毫秒?

从列中提取日期并在 R 中缺少年份时添加年份

如何在 R 中为 ggplot 的每个方面添加 R2?

绘制跨越午夜的到达和离开时间

R语言ggplot2时间序列可视化并在特定日期处添加竖线实战