【问题标题】:POSIXct to character via strftime() is yielding wrong result通过 strftime() 到字符的 POSIXct 产生错误的结果
【发布时间】:2015-02-07 16:28:20
【问题描述】:

我在使用 strftime() 从 POSIXct 日期时间对象中提取正确的字符值时遇到问题。我的示例数据的 dput() 如下:

dput(df1)
structure(list(FlowDate3 = structure(c(1388534400, 1388534400, 
1388534400, 1388534400, 1388534400, 1388534400, 1388534400, 1388534400, 
1388534400, 1388534400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    FlowDate4 = c("2013-12-31", "2013-12-31", "2013-12-31", "2013-12-31", 
    "2013-12-31", "2013-12-31", "2013-12-31", "2013-12-31", "2013-12-31", 
    "2013-12-31")), .Names = c("FlowDate3", "FlowDate4"), row.names = c(NA, 
10L), class = "data.frame")

看起来像这样:

> df1
    FlowDate3  FlowDate4
1  2014-01-01 2013-12-31
2  2014-01-01 2013-12-31
3  2014-01-01 2013-12-31
4  2014-01-01 2013-12-31
5  2014-01-01 2013-12-31
6  2014-01-01 2013-12-31
7  2014-01-01 2013-12-31
8  2014-01-01 2013-12-31
9  2014-01-01 2013-12-31
10 2014-01-01 2013-12-31

> str(df1)
'data.frame':   10 obs. of  2 variables:
 $ FlowDate3: POSIXct, format: "2014-01-01" "2014-01-01" "2014-01-01" ...
 $ FlowDate4: chr  "2013-12-31" "2013-12-31" "2013-12-31" "2013-12-31" ...

为了创建 FlowDate4,我执行了以下操作:

> strftime(df1$FlowDate3, "%Y-%m-%d")
 [1] "2013-12-31" "2013-12-31" "2013-12-31" "2013-12-31" "2013-12-31" "2013-12-31"
 [7] "2013-12-31" "2013-12-31" "2013-12-31" "2013-12-31"

正如您所见,在 FlowDate3 中为日期生成了错误的字符串......年、月和日期都关闭了。我在很多圈子里跑来跑去,试图找出原因,却完全不知所措。 strftime() 的行为不像我过去所经历的那样。任何帮助表示赞赏。

【问题讨论】:

    标签: r datetime strftime posixct


    【解决方案1】:

    您必须在对strptime 的调用中明确设置时区。您的POSIXct 对象的tzone 属性未使用。

    strftime(df1$FlowDate3, format="%Y-%m-%d", tz=attr(df1$FlowDate3, "tzone"))
    

    【讨论】:

    • 一直都是这样,还是最近 R 发行版的新要求?我不记得曾经必须这样做...
    • 时区总是令人困惑。
    • @stokeinfo:您之前可能不必这样做,因为您的数据没有tzone 属性,或者它存在但设置为您当地的时区。我不知道它最近是否在 R 中发生了变化。您需要查看 NEWS 文件和/或 svn 历史记录。
    • 知道了。时区对我的数据并不重要,那么如何确保我的数据没有时区属性? B/c,当我在没有指定时区的情况下使用 as.POSIXct() 进行格式化时,它会抛出 4 个警告,表明没有指定时区会很不高兴。
    • @stokeinfo:使用attr(x,'tzone') <- NULL 删除属性。我从未见过这样的警告,所以在您提供可重现的示例之前,我无法提供更多帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2016-02-20
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多