5

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我得到一个NAMarch 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 值,因为我无法更改它们。我可以按天聚合数据,或者只使用日期对象,但这似乎不是正确的方法。

4

3 回答 3

5

使用没有夏令时的时区为我解决了这类问题。

a_var_posixlt = strptime(as.character( a_var$Date) , '%m/%d/%Y %H:%M',tz="GMT")
于 2012-07-17T20:02:17.447 回答
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:00 前进到英国夏令时 2:00)和不明确(时钟在格林威治标准时间 2:00 回到格林威治标准时间 1:00)。在这种情况下发生的情况是 特定于操作系统的:人们应该期望第一个是 NA,但第二个可以解释为 BST 或 GMT(并且常见的操作系统给出了这两个可能的值)。还要注意(参见 strftime),操作系统工具可能无法正确格式化无效时间。

您的 4 NA 可能会在时钟每年更改两次的时间点上。

于 2012-07-17T20:08:21.300 回答
0

我无法重现该问题,但您可以尝试以下方法。

首先要检查的是您的数据是否正确。复制并粘贴此问题的数据集,然后在您的计算机上再次运行它。你仍然得到错误吗?如果没有,您的数据集中可能有错字。也试试大卫罗宾逊建议的路线。

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

这会回来NA吗?

另一个奇怪的与日期相关NA的 s 来源是语言环境。检查你正在使用什么

Sys.getlocale("LC_TIME")

然后将其更改为不同的。可用的语言环境因您的操作系统而异(这很混乱),但请查看example(Sys.setlocale).

于 2012-07-17T19:57:39.767 回答