转换POSIXct日期时间为Date时出现意外日期-时区问题?

4

当我尝试使用as.DatePOSIXct日期时间转换为Date时,似乎返回了错误的日期。

我怀疑这与时区有关。我尝试了as.Date中的tz参数,但它没有给出预期的日期。

# POSIXct returns day of month 24  
data$Time[3]
# [1] "2020-03-24 00:02:00 IST"

class(data$Time[3])
# [1] "POSIXct" "POSIXt"

# coerce to Date, returns 23 
as.Date(data$Time[3])
# [1] "2020-03-23"

# try the time zone argument, without luck
as.Date(data$Time[3], tz = "IST")
# [1] "2020-03-23"
# Warning message:
# In as.POSIXlt.POSIXct(x, tz = tz) : unknown timezone 'IST' 

Sys.timezone()
# [1] "Asia/Calcutta"

这里可能出了什么问题,有什么想法吗?

2个回答

5

使用结尾处提供的设置,我们可以使用以下任何一种:

# same date as print(x) shows
as.Date(as.character(x))
## [1] "2020-03-24"

# use the time zone stored in x (or system time zone if that is "")
as.Date(x, tz = attr(x, "tzone"))
## [1] "2020-03-24"

# use system time zone
as.Date(x, tz = "")
## [1] "2020-03-24"

# use system time zone
as.Date(x, tz = Sys.timezone())
## [1] "2020-03-24"

# use indicated time zone
as.Date(x, tz = "Asia/Calcutta")
## [1] "2020-03-24"

注意

我们假设了这个设置。

Sys.setenv(TZ = "Asia/Calcutta")
x <- structure(1584988320, class = c("POSIXct", "POSIXt"), tzone = "")

R.version.string
## [1] "R version 4.0.2 Patched (2020-06-24 r78745)"

谢谢!输出为 structure(1584988320, class = c("POSIXct", "POSIXt"), tzone = ""),是的,您发布的习语似乎可以使用:as.Date(data $ Time [3],tz ="亚洲/加尔各答") - curious_cat
这也很有效!as.Date(x, tz = attr(x, "tzone")) 非常感谢! - curious_cat
Sys.timezone() 返回 [1] "Asia/Calcutta"。已相应编辑问题。 - curious_cat
第一个习语 as.Date(x, tz = check_tzones(x)) 似乎失败了。check_tzones(data$Time[3]) 返回 NULL - curious_cat
是的,我也无法让那个工作。我已经修改了答案,只包括那些有效的,并添加了一个注释来显示如何重现输入。 - G. Grothendieck
@G.Grothendieck 感谢您的好回答。您是否介意在此帖子中添加相关的替代方案:R中从POSIXct转换为Date的日期转换,我认为这是一个与此主题密切相关的经典帖子。干杯。 - Henrik

4
警告信息中已经提示了问题所在。 as.Date() 不知道如何将 IST 解释为时区,因此默认使用 UTC。 假设 IST 是印度标准时间(而不是爱尔兰标准时间),并且 IST 是 UTC + 5:30,则 as.Date() 给出了预期结果,即使对您的目的来说是不正确的也是如此。
提供带有以 UTC 为偏移量表示的时区的日期将给出所需的结果。
as.Date("2020-03-24 00:02:00 UTC+5:30")
[1] "2020-03-24"

谢谢!确实是印度的,而不是爱尔兰的! :) 我以为“IST”就可以了,因为第一个posixCT输出中就有一个IST!但显然不行!有没有可接受的时区缩写列表?我搜遍了帮助文档,但找不到。 - curious_cat
现在的问题是,我已经有一个名为data的数据框,其中包含类似于2020-03-24 00:02:00 IST的日期值存储在data$time中。我需要对它们进行字符串操作以获取UTC+5:30吗?还是......?错误是否出现在我使用data$Time<-as.POSIXct(data$Time,format="%m-%d-%y %I:%M %p")创建数据框的地方?我应该这样做才能正确编码时区吗? - curious_cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接