【问题标题】:Converting numeric to date issues将数字转换为日期问题
【发布时间】:2015-08-21 15:39:48
【问题描述】:

我有一个日期列,如下所示

       Date1
       4010
       5178
       5494
       6750
       7106
       39
       39
       172
       1704
       4152

我正在尝试使用此函数将其转换为真实日期

 as.Date(df$Date1, origin = "1970-01-01")

但是我发现这些数字被转换为这些不正确的日期。

    Date1_Converted
    1980-12-24
    1984-03-26
    1985-01-16
    1988-06-25
    1989-06-16
    1970-02-09
    1970-02-09
    1970-06-22
    1974-09-01
    1981-05-15

正确的转换应该是

    Date1_CrctTrnsf
    2005.10.31
    2009.02.11
    2009.12.04        
    2013.05.15
    2014.05.06
    1994.02.22
    1994.02.22 
    1994.08.03
    1999.05.03
    2006.03.22 

我假设这是一个起源问题,不知道如何解决这个问题,非常感谢任何关于如何解决这个问题的帮助。

【问题讨论】:

  • 您是正确的,因为它是一个起源问题。 Date1 列中的数据代表什么?似乎 R 将这些视为天,这就是为什么你最终得到 Date1_Converted 的输出(例如 4010/365 = 10.986 年,这大约是原点和 Date1_Converted 日期的差异。改变原点有帮助吗?还是需要使用已有的原点?
  • Date1 中的数值之间的天数差异似乎与Date1_CrctTrnsf 中的日期之间的天数不一致。例如,查看第二个和第三个值,5494 - 5178 = 316,而as.numeric(as.Date("2009-12-04")) - as.numeric(as.Date("2009-02-11")) = 296。
  • @small_data88,我之前尝试过更改原点,我将原点从origin = "1970-01-01" 更改为origin = "1994-01-15",因此它只是将39 转换为1994.02.22,但剩余日期不正确。您对这些代表天数的数字提出了很好的观点。
  • @BridgeportByronTucker 实际上是1994-11-08,如果你想要像示例中那样使用点而不是破折号,可以使用gsub
  • @Hack-R,origin 不起作用,如您所见,观察 6 应该是 1994.02.22 而不是 1994.12.17 :)

标签: r date lubridate


【解决方案1】:
# First I copied the data from your question
df <- read.table(con <-file("clipboard"), header = T)
df

# Convert the format
df1 <- as.Date(df$Date1, origin = "1994-11-08")
df1
> as.data.frame(gsub("-", ".", df1))
   gsub("-", ".", df1)
1           2005.10.31
2           2009.01.11
3           2009.11.23
4           2013.05.02
5           2014.04.23
6           1994.12.17
7           1994.12.17
8           1995.04.29
9           1999.07.09
10          2006.03.22

但是请注意,数据中似乎存在错误(或者至少是您期望从数据中获得的结果——您是如何产生这些数字的?):

  • 第 6 行的输入是 39
  • 第 7 行的输入是 39
  • 第 8 行的输入是 172

172 - 39 = 133

但是,您希望第 6 行和第 7 行的日期为 1994.02.22,第 8 行的结果为 1994.08.03这在数学上是不可能的,因为这两个日期之间有 162 天。

【讨论】:

  • 我之前试过,使用origin的最终输出不会产生准确的结果,你可以看到观察6应该是1994.02.22
  • 见我上面的评论。数值和预期日期输出不一致。这不仅仅是一个起源问题。确定数值是以 1 天为单位的吗?
  • @eipi10 是正确的,我正在尝试 lubridate 的 ymd 函数。 :)
  • @BridgeportByronTucker 我认为错误出在您的数据中。请注意,结果 6 和 7 的输入是 39,第 8 行的输入是 172。 172 - 39 = 133。但是,1994.02.221994.08.03 之间有 162 天。 lubridate 软件包很棒,但它无法帮助您处理不正确的数据。
  • @Hack-R :) 你说得对,有些东西很乱,我的数据看起来不正确
猜你喜欢
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2017-09-16
相关资源
最近更新 更多