【问题标题】:Passing POSIXct object to function returns numeric vector将 POSIXct 对象传递给函数返回数值向量
【发布时间】:2016-11-09 13:14:37
【问题描述】:

我正在尝试对POSIXct 向量进行一些操作,但是当我将它传递给函数时,向量变为numeric 向量,而不是保留POSIXct 类,即使函数本身也是如此只返回对象:

# Sample dates from vector and it's class.
> dates <- as.POSIXct(c("2012-02-01 12:32:00", "2012-10-24 17:25:56", "2008-09-26 17:13:31", "2011-08-23 11:11:17,", "2015-09-19 22:28:33"), tz = "America/Los_Angeles")
> dates
[1] "2012-02-01 12:32:00 PST" "2012-10-24 17:25:56 PDT" "2008-09-26 17:13:31 PDT" "2011-08-23 11:11:17 PDT" "2015-09-19 22:28:33 PDT"
> class(dates)
[1] "POSIXct" "POSIXt" 
# Simple subset is retaining original class.
> qq <- dates[1:5]
> qq
[1] "2012-02-01 12:32:00 PST" "2012-10-24 17:25:56 PDT" "2008-09-26 17:13:31 PDT" "2011-08-23 11:11:17 PDT" "2015-09-19 22:28:33 PDT"
> class(qq)
[1] "POSIXct" "POSIXt" 
# sapply on the same subset using simple "return" function changes class to "numeric" - why? How to retain "POSIXct"?
> qq2 <- sapply(dates[1:5], function(x) x)
> qq2
[1] 1328128320 1351124756 1222474411 1314123077 1442726913
> class(qq2)
[1] "numeric"

为什么会这样?如何保留原始向量的POSIXct 类?我知道 POSIXct numeric 在后台,但我想保留原始类以提高可读性。

【问题讨论】:

    标签: r vector numeric posixct coercion


    【解决方案1】:

    我们可以使用lapply 代替sapply,因为sapply 默认有simplify = TRUE 选项。因此,如果list 元素的长度相同,它将根据list 元素的长度将其简化为vectormatrix,并且POSIXct 存储为numeric

    lst <- lapply(dates, function(x) x)
    

    如果我们需要使用sapply,那么可以选择simplify = FALSE

    lst <- sapply(dates, function(x) x, simplify=FALSE)
    

    应用函数后,如果我们需要作为向量输出,

    do.call("c", lst)
    

    关于时区的变化,在?DateTimeClasses中有记载

    在“POSIXlt”对象上使用 c 会将它们转换为当前时区, 并且在“POSIXct”对象上删除任何“tzone”属性(即使它们 都标有相同的时区)。

    因此,可能的选择是(如 @kmo 在 cmets 中所述)

    .POSIXct(lst, tz = "America/Los_Angeles")
    #[1] "2012-02-01 12:32:00 PST" "2012-10-24 17:25:56 PDT" "2008-09-26 17:13:31 PDT" "2011-08-23 11:11:17 PDT" "2015-09-19 22:28:33 PDT"
    

    或者像 cmets 中提到的 @thelatemail 一样

    .POSIXct(sapply(dates,I), attr(dates,"tzone") )
    

    【讨论】:

    • @kmo 我想你可能需要用tz指定时区
    • 感谢您的回答!我注意到一件事 - 转换为矢量后,时区更改为本地时区:&gt; do.call("c", lapply(dates[1:5], function(x) x)) [1] "2012-02-01 21:32:00 CET" "2012-10-25 02:25:56 CEST" "2008-09-27 02:13:31 CEST" "2011-08-23 20:11:17 CEST" "2015-09-20 07:28:33 CEST"。对那个有什么想法吗?
    • @kmo 在我的系统中,您的原始日期以PST PDT 作为时区。
    • 是的,原来的确实有“PST/PDT”,但是在do.call("c", lst) tz 更改为我的本地时区之后,即“CEST/CET” - 我想知道为什么会发生这种情况以及如何缓解这个问题。
    • @akrun - 我想我已经欺骗了自己 - 我应该去睡觉了! - 只要.POSIXct(sapply(dates,I), attr(dates,"tzone") ) 就可以了。
    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多