【问题标题】:Find four digit numbers and convert them to calendary date in R查找四位数字并将它们转换为 R 中的日历日期
【发布时间】:2021-03-03 15:45:00
【问题描述】:

我有一个包含混合日期格式的数据框列,例如 30/06/2020、07/2020 和 2020。我想将四位数字转换为日期(例如 2020 -> XX/XX /2020)。我有不同的年份,而不仅仅是 2020 年,所以如果可能的话,我更喜欢通用的表达方式。

补充问题: 当我从 excel 文件中读取数据时,我得到的是五位数字而不是日期。根据我的阅读,这些数字是自 1900 年以来经过的天数。因此,实际列中还包含五位数字、代表年份的四位数字和其他日期。 我已经处理了这个问题,但不是以最佳方式。有没有一种通用的方法来处理所有这些格式?抱歉,帖子太大了

K

【问题讨论】:

  • 我不知道有一个函数能够将不同的日期格式解析到同一列中。 (试试看lubridate,它有很多处理日期的函数)。但是,如果您知道最后四位数字代表年份,则可以提取信息而无需将其解析为日期。见stringr::str_sub。对于您的最后一个问题,您可以使用janitor::excel_numeric_to_date()
  • 请分享一些示例输入(复制/粘贴有效的 R 语法)和所需的输出。如果输入是2020,你想要一个带有"XX/XX/2020"的字符串吗?或者,如果没有找到月份/年份,您是否希望默认为 1 月 1 日?或者是其他东西?您的标题是“四位数字”,所以您只需要年份吗?
  • 这个stackoverflow.com/a/52319606/3358272 可能有用(特别是以formats <- c(...) 开头的第三个代码块),其中formats 按优先顺序提供候选格式。
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example

标签: r dataframe date


【解决方案1】:

感谢大家的想法。你是对的,我下次需要更具体。老实说,我专注于解决问题,我相信我做到了。

关于数据,一个简单的说明可能如下:

date
08/2003
12/06/2002
38054
2004
...
...
...

首先,我找到了数据框列 (RHO_DataBase$date) 的哪些元素表示为年份(例如 2003 年)并将它们转换为日期(例如 15/05/2003):

#Step 1
counter1 <- which( (!is.na(as.numeric(RHO_DataBase$date))) & (as.numeric(RHO_DataBase$date)<2030)  )
for (i in counter1) {
  RHO_DataBase$date[i] <- paste ("15/05/",sep="",RHO_DataBase$date[i])
}

然后,我找到了哪些元素用数值表示(自 1899 年 12 月 30 日以来的天数),并将它们的格式转换为日/月/年

#Step 2
counter2 <- which(!is.na(as.numeric(RHO_DataBase$date)))
for (i in counter2) {
  RHO_DataBase$date[i] <- format(as.Date(as.numeric(RHO_DataBase$date[i]), origin = "1899-12-30"),'%d/%m/%Y')
}

然后,我找到了以其他剩余格式表示的列元素,在这种情况下只有月/年,并使用粘贴将其更改为日/月/年。

# Step 3:
counter3<-which(is.na(as.Date( RHO_DataBase$date, "%d/%m/%Y") ) )
for (i in counter3) {
  RHO_DataBase$date[i] <- paste ("01/",sep="",RHO_DataBase$date[i])
} 

干杯, 克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2015-07-27
    • 2014-08-17
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多