【问题标题】:Error: origin must be supplied错误:必须提供原点
【发布时间】:2017-03-14 20:07:18
【问题描述】:

我有以下代码来清理数据集。

data1 <- data1 %>% 
  mutate(YEAR = year(DATE), 
         MONTH = month(DATE), 
         DAY=day(DATE), 
         HOUR=hour(TIME), 
         MINUTE = minute(TIME), 
         RETURN= ((PRICE-lag(PRICE))/lag(PRICE))
  ) %>% 
  filter(HOUR >= 9, (HOUR <= 16 & MINUTE <=61)) %>%
  group_by(MINUTE, HOUR, DAY, MONTH, YEAR) %>% 
  summarize(AV.PRICE = mean(PRICE, na.rm=TRUE), 
            SUM.SIZE=sum(SIZE, na.rm=TRUE),
            RV=sum(RET^2)) %>%
  arrange(YEAR, MONTH, DAY, HOUR, MINUTE) %>%
  mutate(DATETIME = as.POSIXct(
    paste(YEAR,"/",MONTH,"/", DAY, " ", HOUR,":", MINUTE,":00",sep=""), 
    format="%Y/%m/%d %H:%M:%S", origin = "1970-01-01")
  )

但是,它有时会给我错误消息:Error: 'origin' must be supplied

奇怪的是,我在会话中第一次运行此代码时并没有出现该错误,而是在随后的运行中出现。如果我重新启动会话,问题会消失一次,并在以后的运行中返回。因此,我必须始终重新启动才能使其正常工作。

我检查了这个问题:How to solve: "Error in as.POSIXct.numeric(X[[2L]], ...) : 'origin' must be supplied",这表明它可能是因为它正在从整数转换为时间。然而,glimpse 的数据表明 DATE 是&lt;date&gt; 类而不是整数。

为了安全起见:我遵循了错误的建议,并在所有处理日期的函数中添加了一个 origin = "1970-01-01" 参数:

data1 <- data1 %>% 
  mutate(YEAR = year(DATE, origin = "1970-01-01"),
         MONTH = month(DATE, origin = "1970-01-01"), 
         DAY=day(DATE, origin = "1970-01-01"), 
         HOUR=hour(TIME, origin = "1970-01-01"),
         MINUTE = minute(TIME, origin = "1970-01-01"), 
         RET= ((PRICE-lag(PRICE))/lag(PRICE))
  ) %>% 
  filter(HOUR >= 9, (HOUR <= 16 & MINUTE <=61)) %>%
  group_by(MINUTE,HOUR,DAY,MONTH,YEAR) %>% 
  summarize(AV.PRICE = mean(PRICE, na.rm=TRUE), 
            SUM.SIZE=sum(SIZE, na.rm=TRUE),
            RV=sum(RET^2)
  ) %>% 
  arrange(YEAR, MONTH, DAY, HOUR, MINUTE) %>% 
  mutate(DATETIME = as.POSIXct(
    paste(YEAR,"/",MONTH,"/", DAY, " ", HOUR,":", MINUTE,":00",sep=""), 
    format="%Y/%m/%d %H:%M:%S", origin = "1970-01-01")
  )

它返回Error: unused argument (origin = "1970-01-01")

如果有帮助,这里是我的数据集的一瞥:

Observations: 146,016,609
Variables: 4
$ DATE  <date> 2008-01-02, 2008-01-02, 2008-01-02, 2008-01-02, 2008-01-02, 2008-01-02, 2008-01-02, ...
$ TIME  <S4: Period> 9H 0M 4S, 9H 0M 4S, 9H 0M 4S, 9H 0M 4S, 9H 0M 4S, 9H 0M 4S, 9H 0M 4S, 9H 0M 4S...
$ PRICE <dbl> 146.86, 146.86, 146.86, 146.86, 146.86, 146.86, 146.86, 146.86, 146.86, 146.86, 146.8...
$ SIZE  <int> 1000, 1000, 1000, 500, 2400, 1000, 1000, 1000, 2500, 1000, 1000, 400, 1000, 1000, 100...

我正在寻找使用基本包函数或最多 lubridate/dplyr 的答案。谢谢!

【问题讨论】:

    标签: r datetime


    【解决方案1】:

    或使用随时包中的anydate()

    R> anydate(20170314L)  # integer
    [1] "2017-03-14"
    R> anydate(20170314)   # numeric
    [1] "2017-03-14"
    R> anydate("20170314") # character 
    [1] "2017-03-14"
    R> anydate(as.factor("20170314")) 
    [1] "2017-03-14"
    R> 
    

    还有更多,包括猜测大多数(理智的)日期(以及 anytime() 的日期时间)格式 --- 并且不需要(大部分是冗余的)来源。

    编辑:给定你的数据,你让它变得复杂。试试这个:

    最小的 data.frame 对象
    R> df <- data.frame(DATE=rep(as.Date("2008-01-02"),4), TIME=rep(period(c(9,0,4), c("hour", "minute", "second")), 4))
    R> df
            DATE     TIME
    1 2008-01-02 9H 0M 4S
    2 2008-01-02 9H 0M 4S
    3 2008-01-02 9H 0M 4S
    4 2008-01-02 9H 0M 4S
    R>
    
    只需添加日期和时间
    R> df$DATE + df$TIME
    [1] "2008-01-02 09:00:04 UTC" "2008-01-02 09:00:04 UTC" "2008-01-02 09:00:04 UTC" "2008-01-02 09:00:04 UTC"
    R> class(df$DATE + df$TIME)
    [1] "POSIXlt" "POSIXt" 
    R> as.POSIXct(df$DATE + df$TIME)
    [1] "2008-01-02 09:00:04 UTC" "2008-01-02 09:00:04 UTC" "2008-01-02 09:00:04 UTC" "2008-01-02 09:00:04 UTC"
    R> 
    

    这就是你的答案。

    【讨论】:

    • 嘿,我正在试用你的包,我不再收到原始错误,但我得到了 DATETIME 的 NA。请参阅修改后的问题以获取代码。我不熟悉你的包裹,如果我没有看到基本的东西,很抱歉。
    • 当您的输入无法被所有可用格式解析时,您会从 anytime()anydate() 获得 NA。您可以添加自定义格式,请参阅包帮助。
    【解决方案2】:

    我在使用lubridate 包时遇到了同样的错误Error: 'origin' must be supplied - hms() 函数。罪魁祸首是代码引用了 hms() 中的函数 hms package 。所以当我将它引用到lubridate::hms() 时,错误就消失了。

    air_reserve <- 
      air_reserve %>% 
      mutate( Reserve.time = lubridate::hms(Reserve.time)
              , Visit.time = lubridate::hms(Visit.time)
              , Hours = lubridate::hour(Visit.time) )
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2018-12-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2018-04-01
      • 2019-01-11
      • 2021-07-12
      • 1970-01-01
      相关资源
      最近更新 更多