首页 > 解决方案 > 将负数转换为 Date 或 POSIXct 对象

问题描述

我一直打算将一些 4 到 2 位负数(表示 BCE 日期)转换为 Date 对象。在此之前,我想将年、月和日列合并为一个列。如果你们对我如何使用 lubridate 做到这一点有任何想法,我将不胜感激。

> NOAA_data %>% slice(10:30)
# A tibble: 21 x 39
   `Search Paramet~  Year    Mo    Dy    Hr    Mn   Sec   Tsu   Vol `Location Name` Latitude
   <chr>            <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>              <dbl>
 1 NA               -1050    NA    NA    NA    NA     0    NA    NA JORDAN:  SW:  ~     29.6
 2 NA                -759    NA    NA    NA    NA     0    NA    NA ISRAEL:  JERUS~     33  
 3 NA                -590    NA    NA    NA    NA    NA     7    NA LEBANON:  SUR ~     33.3
 4 NA                -550    NA    NA    NA    NA    NA    NA    NA GREECE:  MOUNT~     37  
 5 NA                -525    NA    NA    NA    NA    NA     8    NA LEBANON:  SUR ~     33.6
 6 NA                -480     9    29    NA    NA    NA  3469    NA GREECE:  SARON~     37.9
 7 NA                -479    NA    NA    NA    NA    NA     9    NA GREECE:  MACED~     39.7
 8 NA                -432    NA    NA    NA    NA    NA    NA    NA GREECE:  ROMAN~     37  
 9 NA                -426     6    NA    NA    NA    NA    10    NA GREECE:  EUBOEA     38.9
10 NA                -400    NA    NA    NA    NA    NA    NA    NA IRAN:  REY,EIV~     35.5

非常感谢您提前。

标签: rdatelubridate

解决方案


我认为当前的最佳做法是在 CE 中设置日期,然后减去年份以达到 BCE。算术可能是粗略的,因为没有零年,但这个例子似乎可以按预期工作:

lubridate::ymd("0000-09-29") - lubridate::years(480)

有关更多详细信息,您可以查看Tayflo 对 lubridate 的关于 BCE 日期的 github 问题的详尽解释,该问题几天前刚刚重新打开。

编辑:对于您的特定数据,您只需将值粘贴到 lubridate::ymd_hms() 函数中,它会将其解析为单个列

NOAA_data %>% mutate(date = ymd_hms(paste0(c('0000','-', Mo,'-', Dy,
                                           '_', Hr,':', Mn, ':', Sec))) - 
                                     lubridate::years(Year))

您还必须为您的 NA 添加一些 ifelse(),将每个设置为合理的默认值(例如,01 代表天,00 代表分钟等)。我不会将它添加到我的示例代码中,因为它会更难阅读。


推荐阅读