无法将已解析的日期/时间列更改为CST,然后更改为UTC

时间:2014-10-31 01:07:43

标签: r parsing csv lubridate

我有一张信息表,包括日期和时间。年,月,日,时(HHMM)在单独的栏目中。时间在CST。我需要将它们全部放在一个col中。并将时间更改为UTC。我需要使用lubridate来做到这一点。

以下是我要做的事情。但总是出现错误

data<-read.csv("StormEvents_details_d1950_d2014.csv", header=T, stringsAsFactors = FALSE)

data1<-mutate(data1, begin_date=str_c(begin_year, "-", begin_month, "-", begin_day, "  ", begin_time))
data1<-mutate(data1, end_date=str_c(end_year, "-", end_month, "-", end_day, "  ", end_time))

data1$begin_date<-ymd_hm(data1$begin_date)
data1$begin_date<-ymd_hms(data1$begin_date, tz="CST6CDT")

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?

1 个答案:

答案 0 :(得分:0)

这可能与此错误有关: https://github.com/hadley/lubridate/issues/224

我不认为OP会对此感兴趣,但可以使用以下代码重现此错误:

library(lubridate)
dmy_hm("3/10/2010 1:59",tz="Australia/Melbourne")  # good
dmy_hm("3/10/2010 2:00",tz="Australia/Melbourne")  # this time never existed
dmy_hm("10/3/2010 2:00",tz="US/Pacific")           # this time never existed

请注意,在春季,通过将时间从凌晨2点改为凌晨3点将时钟调整为夏令时,因此每年有60分钟不存在。

显然它不应该出错,但是我用最新的lubridate(1。3。3)(2015年4月23日)尝试了这个并且错误仍然存​​在。

我可以看到两种解决方法。

  1. 将带有ymd_hms数据转换为UCT(它没有DST调整)
  2. 然后使用difftime从这些时间中减去时区差异。
  3. 使用attr(ddf$time, "tzone") <- "US/Pacific"
  4. 将时区更改为显示所需的时区

    或者...

    1. 将数据读入字符数组。
    2. 子集&#34;坏&#34;字符数据集。
    3. 然后使用ymd_hms(或其他)
    4. 转换字符数据

      希望这有助于某人。