使用 SQL 数据将日期 'year - month - date' 转换为仅 'year and month'

Converting a date 'year - month - date' to only 'year and month' in r with SQL data

我正在处理一个需要合并两个数据集的问题。第一个数据集来自 SQL 并使用 RODBC 库导入,而第二个数据集是从 Excel 导入的。我想按月和年合并这两个数据框,但是为了做到这一点,我需要将第一个 DF 的日期列从年月日转换为年月。

我曾尝试像往常一样使用 as.Date(df$postingdate, format = '%Y %M'strftime(df$postingdate,"%Y %m"),但是第一个不起作用,第二个将列更改为字符。这几天一直是个问题,我尝试了很多东西,主要是以下link的建议:[

在底部,我从使用“dput()”(df2) 时得到的输出创建了一个 df,我注意到在发布日期下,数据被转换为数字,而不是实际日期(“ 2020-05-28”、“2020-10-09”、“2021-10-19”)。因此,我也不确定我有什么问题,因为我使用了错误的函数,或者因为数据是“未知”数据类型。

我想将日期转换为年月的第一个数据集的示例:

df <- data.frame(
  Posting_Date = c("2020-05-28", "2020-10-09", "2021-10-19"), Sales = c(2702.5, 369, 4134),
  Sales_person_code = c(6L, 10L, 10L), EDI = c(1L, 1L, 1L), 
  City = c(141L, 4L, 6L), Kæde = c(12L, 12L, 12L), 
  Vinter = c(0, 0, 0), Forår = c(1, 0, 0), Sommer = c(0, 0, 0), 
  Efterår = c(0, 1, 1), Fredag = c(0, 1, 0), Lørdag = c(0, 0, 0), 
  Mandag = c(0, 0, 0), Onsdag = c(0, 0, 0), Søndag = c(0, 0, 0), 
  Tirsdag = c(0, 0, 1), Torsdag = c(1, 0, 0), 
  year_month = c("2020-05-28", "2020-10-09", "2021-10-19"))

df2 <- data.frame(
  Posting_Date = c(18410, 18544, 18919), Sales = c(2702.5, 369, 4134), 
  Sales_person_code = c(6L, 10L, 10L),EDI = c(1L, 1L, 1L), 
  City = c(141L, 4L, 6L), Kæde = c(12L, 12L, 12L), 
  Vinter = c(0, 0, 0), Forår = c(1, 0, 0), Sommer = c(0, 0, 0), 
  Efterår = c(0, 1, 1), Fredag = c(0, 1, 0), Lørdag = c(0, 0, 0), 
  Mandag = c(0, 0, 0), Onsdag = c(0, 0, 0), Søndag = c(0, 0, 0), 
  Tirsdag = c(0, 0, 1), Torsdag = c(1, 0, 0), 
  year_month = c(18410, 18544, 18919))

在此先感谢您的帮助。请让我知道如果我能做些什么来帮助你们,帮助我

前面,您对 as.Date(df$Posting_Date, format="%Y %m") 的尝试似乎倒退了:函数 as.Date 用于将字符串转换为 Date-class,它的 format= 参数是为了确定如何找到 字符串 的 year/month/day 组件,而不是您以后要如何转换它。 (请注意,在 R 中,Date 显示为 YYYY-MM-DD。总是。告诉 R 你想要一个日期只是 year/month 是说你想将它转换为字符串,不更长的类似日期或类似数字。lubridate 也许其他包允许您拥有类似于 Date 的对象。)

对于df,一个可以只是子集字符串而不解析为Date-class:

substring(df$Posting_Date, 1, 7)
# [1] "2020-05" "2020-10" "2021-10"

如果你想对它们做任何类似数字的事情,你可以先转换成Date-class,然后再用format(.)转换成一个特定的字符串格式。

as.Date(df$Posting_Date)
# [1] "2020-05-28" "2020-10-09" "2021-10-19"
format(as.Date(df$Posting_Date), format = "%Y-%m")
# [1] "2020-05" "2020-10" "2021-10"

但是,对于 df2,由于它是数字,因此您需要指定 origin= 而不是 format=。我推断这些是基于纪元的,所以

as.Date(df2$Posting_Date, origin = "1970-01-01")
# [1] "2020-05-28" "2020-10-09" "2021-10-19"
format(as.Date(df2$Posting_Date, origin = "1970-01-01"), format = "%Y-%m")
# [1] "2020-05" "2020-10" "2021-10"

请注意,R 在内部将 Date(顺便说一句,POSIXct)存储为数字:

dput(as.Date(df2$Posting_Date, origin = "1970-01-01"))
# structure(c(18410, 18544, 18919), class = "Date")