【问题标题】:R:Converting from Character to POSIXct loses hours and minutesR:从字符转换为 POSIXct 会丢失小时和分钟
【发布时间】:2014-11-26 07:50:15
【问题描述】:

早上好,

我正在尝试从字符转换为 POSIXct,但是当我这样做时,我会从数据中丢失小时和分钟。

hourlyData(数据框)

    Login   Expo    EquityUSD   Period                    UnrealizedProfitUSD
1   252957  0.00    7.187185    2014-02-03 00:00:00.000     0.00000
2   252957  0.00    7.187772    2014-02-03 01:00:00.000     0.00000
3   252957  0.00    7.188198    2014-02-03 02:00:00.000     0.00000
4   252957  0.00    7.187825    2014-02-03 03:00:00.000     0.00000
5   252957  0.00    7.187079    2014-02-03 04:00:00.000     0.00000
6   252957  0.00    7.187079    2014-02-03 05:00:00.000     0.00000
7   252957  0.00    7.188731    2014-02-03 06:00:00.000     0.00000
8   252957  0.00    7.186279    2014-02-03 07:00:00.000     0.00000
9   252957  0.00    7.187185    2014-02-03 08:00:00.000     0.00000

当我输入 class(hourlyData$Period) 时,我得到 Character。 但是,当我尝试将此列转换为 hourlyData$Period = as.POSIXct(hourlyData$Period) 时,我得到以下输出:
每小时数据

    Login   Expo    EquityUSD   Period       UnrealizedProfitUSD
1   252957  0.00    7.187185    2014-02-03   0.00000
2   252957  0.00    7.187772    2014-02-03   0.00000
3   252957  0.00    7.188198    2014-02-03   0.00000
4   252957  0.00    7.187825    2014-02-03   0.00000
5   252957  0.00    7.187079    2014-02-03   0.00000
6   252957  0.00    7.187079    2014-02-03   0.00000
7   252957  0.00    7.188731    2014-02-03   0.00000
8   252957  0.00    7.186279    2014-02-03   0.00000
9   252957  0.00    7.187185    2014-02-03   0.00000

小时和分钟已从“期间”列中删除。有谁知道为什么会发生这种情况,或者如何预防?

谢谢

迈克

【问题讨论】:

  • 这可能在某种程度上是特定于操作系统的,以下命令对我来说会产生正确的结果(Mac OS X 上的 R 3.1.1):as.POSIXct(c('2014-02-03 00:00:00.000', '2014-02-03 01:00:00.000', '2014-02-03 02:00:00.000'))
  • 我也得到了正确的结果,R 3.1.1,windows 7。
  • 我发现确实有一个约会惹麻烦。 2014-03-31 03:00:00。出于某种未知原因,当我删除该特定日期时,转换工作。所以我认为你们是正确的,它应该可以工作,但也许我的数据有问题。感谢您的帮助!
  • 你在土耳其是偶然的吗? timeanddate.com/time/dst/2014a.html请说明您的时区。
  • 一般建议:在创建 POSIXt 对象时始终明确指定时区(通过使用tz 参数)。

标签: r datetime posixct


【解决方案1】:

其他答案暗示了这个问题,但并没有真正解决它。 as.POSIXct(...) 在传递带有无效时间的字符向量时会出现奇怪的行为:as.POSIXct(...) 删除所有元素的时间部分,而不是为那些具有无效时间的元素返回 NA。

您可以通过显式提供格式规范来“修复”此问题,即使您使用的是默认规范(请参阅下面的最后一行)。

x <- sprintf('%02d:00:00', 20:25)          # 25:00:00 is not a valid time spec.
y <- sprintf('%s %s', '2018-01-01',x)      # last element has invalid time
as.POSIXct(head(y,-1))                     # works fine
## [1] "2018-01-01 20:00:00 HST" "2018-01-01 21:00:00 HST" "2018-01-01 22:00:00 HST" "2018-01-01 23:00:00 HST" "2018-01-02 00:00:00 HST"
as.POSIXct(y)                              # fails miserably
## [1] "2018-01-01 HST" "2018-01-01 HST" "2018-01-01 HST" "2018-01-01 HST" "2018-01-01 HST" "2018-01-01 HST"
as.POSIXct(y, tz='UTC')                    # tz does not fix this...
## [1] "2018-01-01 UTC" "2018-01-01 UTC" "2018-01-01 UTC" "2018-01-01 UTC" "2018-01-01 UTC" "2018-01-01 UTC"
as.POSIXct(y, format='%Y-%m-%d %H:%M:%S')  # but this does...
## [1] "2018-01-01 20:00:00 HST" "2018-01-01 21:00:00 HST" "2018-01-01 22:00:00 HST" "2018-01-01 23:00:00 HST" "2018-01-02 00:00:00 HST" NA 

在 Win 7 x64 上运行 R 3.4.0。

【讨论】:

    【解决方案2】:

    我会使用strptime:

    char_data = c('2014-02-03 00:00:00.000', '2014-02-03 01:00:00.000', '2014-02-03 02:00:00.000')
    strptime(char_data, '%Y-%m-%d %H:%M:%S')
    [1] "2014-02-03 00:00:00 CET" "2014-02-03 01:00:00 CET"
    [3] "2014-02-03 02:00:00 CET"
    

    【讨论】:

    • as.POSIXct 使用strptime 解析日期时间。
    【解决方案3】:

    “2014-03-31 03:00:00”不是您居住的有效日期时间,因为“2014-03-31 02:59:59”后面紧跟着“2014-03-31 04: 00:00”,因为切换到夏令时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多