如何清除posix值的NA标志?

时间:2012-07-17 19:15:41

标签: r

csv格式的示例数据。保存在文件broken_posix.csv

Date
3/10/2012 23:00
3/11/2012 0:00
3/11/2012 1:00
3/11/2012 2:00
3/11/2012 3:00
3/11/2012 4:00
3/11/2012 5:00
3/11/2012 6:00
3/11/2012 7:00
3/11/2012 8:00
3/11/2012 9:00
3/11/2012 10:00
3/11/2012 11:00
3/11/2012 12:00
3/11/2012 13:00
3/11/2012 14:00
3/11/2012 15:00
3/11/2012 16:00
3/11/2012 17:00
3/11/2012 18:00
3/11/2012 19:00
3/11/2012 20:00
3/11/2012 21:00
3/11/2012 22:00
3/11/2012 23:00
3/12/2012 0:00
3/12/2012 1:00
3/12/2012 2:00
3/12/2012 3:00
3/12/2012 4:00
3/12/2012 5:00
3/12/2012 6:00
3/12/2012 7:00
3/12/2012 8:00
3/12/2012 9:00
3/12/2012 10:00
3/12/2012 11:00

大家好,我有这个文件broken_posix.csv 我可以用

读取文件
a_var <- read.csv("broken_posix.csv")

然后我可以使用

将其转换为posix
a_var_posixct = as.POSIXct(strptime( as.character( a_var$Date) , '%m/%d/%Y %H:%M'))

a_var_posixlt = strptime(as.character( a_var$Date) , '%m/%d/%Y %H:%M')

现在出现问题,因为当我使用posixct时,我每年在字符串中得到4个NA值。当我使用posixlt时,我会在NA

上获得一个March 11,2012 at 2 (daylight savings time)

你会在运行时看到我的意思

which(is.na(a_var_posixct))
which(is.na(a_var_posixlt))

a_var_posixct[4]
a_var_posixlt[4]

每当您应用操作时,第四个值始终为NA值,即使它显然是posixlt的日期值。

我试过省略这个值只是为了弄乱其余的posix字符串。 我已经尝试将posix字符串设置为自身,试图清除NA标志,没有效果。 我甚至尝试将其设置为字符值,只是为了丢失小时和分钟格式。

我认为这种情况是因为夏令时而发生的。处理这是非常令人沮丧的,因为当我尝试在日期运行其他函数时,我必须尝试避免NA值,因为我无法更改它们。我可以按天聚合数据,或者只使用日期对象,但这似乎不是正确的方法。

3 个答案:

答案 0 :(得分:5)

使用没有夏令时的时区可以解决这类问题。

a_var_posixlt = strptime(as.character( a_var$Date) , '%m/%d/%Y %H:%M',tz="GMT")

答案 1 :(得分:2)

来自?as.POSIXct

字符输入首先由strptime转换为“POSIXlt”类:数字输入首先转换为“POSIXct”。需要在两个日期时间类之间进行的任何转换都需要一个时区:从“POSIXlt”到“POSIXct”的转换将验证所选时区的时间。一个问题是在DST过渡时会发生什么,例如在英国

as.POSIXct(strptime('2011-03-27 01:30:00', '%Y-%m-%d %H:%M:%S'))
as.POSIXct(strptime('2010-10-31 01:30:00', '%Y-%m-%d %H:%M:%S'))

分别无效(时钟在格林尼治标准时间凌晨1点到2点BST前进)并且不明确(时钟在BST 2:00返回到格林尼治标准时间1点)。在这种情况下会发生什么特定于操作系统:一个应该期望第一个是NA,但第二个可以被解释为BST或GMT(并且常见操作系统给出两个可能的值)。另请注意(请参阅strftime),OS工具可能无法正确格式化无效时间。

你的4 NA可能是在时钟每年改变两次的时刻。

答案 2 :(得分:0)

我无法重现这个问题,但这里有一些你可以试试的东西。

要检查的第一件事是您的数据是正确的。复制并粘贴此问题的数据集,然后在您的计算机上再次运行它。你还得到错误吗?如果没有,您的数据集中可能会出现拼写错误。也请尝试David Robinson建议的那条线。

as.POSIXlt(strptime("3/11/2012 2:00", '%m/%d/%Y %H:%M'))

这会返回NA吗?

奇怪的与日期相关的NA的另一个来源是语言环境。检查你的用途

Sys.getlocale("LC_TIME")

然后将其更改为另一个。可用的区域设置因您的操作系统而异(这很糟糕),但请查看example(Sys.setlocale)