R:从Character转换为POSIXct会丢失小时和分钟

时间:2014-11-26 07:50:15

标签: r datetime posixct

早上好,

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

hourlyData(dataframe)

    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)时,我得到以下输出:
hourlyData

    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

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

由于

麦克

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

我使用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"

答案 2 :(得分:0)

&#34; 2014-03-31 03:00:00&#34;不是您居住的有效日期时间,因为&#34; 2014-03-31 02:59:59&#34;紧接着是&#34; 2014-03-31 04:00:00&#34;由于切换到夏令时。