我使用以下代码从日期(以dd/mm/yyyy的形式)中给出一周中的几天。
编辑:我已经上传了一个更相关的数据集。df <- structure(list(Date = c("18/01/2013", "18/01/2013", "18/01/2013",
"18/01/2013", "18/01/2013"), Time = c("07:25:30", "07:25:40",
"07:25:50", "07:26:00", "07:26:10"), Axis1 = c(217L, 320L, 821L,
18L, 40L), Steps = c(6L, 7L, 5L, 1L, 1L), wday = c(7, 7, 7, 7, 7)), .Names = c("Date", "Time", "Axis1", "Steps", "wday"), row.names = 18154:18158, class = "data.frame")
library(lubridate)
df$wday = wday(df$Date)
df$wday.name = wday(df$Date, label = TRUE, abbr = TRUE)
然而,18/1是星期五,而不是R报告的星期六。
谁有什么建议,如何纠正这一点?
编辑:我试着按照德克的建议去做……
as.POSIXlt(df[,1])$wday
…但这仍然意味着18/1是星期六。
我的时区是GMT/UTC(+ 1为英国夏令时),但是因为我只想让R从日期列读取(这只是d/m/y),我认为我不需要指定这个…
我怎样才能得到一个正确的wday列被添加到我现有的R数据框架?(如我之前的原始脚本所述)。我正在努力获得建议的编码工作,因为我以错误的格式给出了数据帧-抱歉。
您可以使用基R函数。使用您的df
对象:
R> as.POSIXlt(df[,1])$wday
[1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
R> weekdays(as.Date(df[,1]))
[1] "Friday" "Friday" "Friday" "Friday" "Friday"
[6] "Friday" "Friday" "Friday" "Friday" "Friday"
[11] "Friday" "Friday" "Friday" "Friday" "Saturday"
[16] "Saturday" "Saturday" "Saturday" "Saturday"
R>
由于没有指定TZ,因此在结束时溢出到星期六。
如果你这样做
R> df <- data.frame(Date=seq(as.POSIXct("05:00", format="%H:%M", tz="UTC"),
+ as.POSIXct("23:00", format="%H:%M", tz="UTC"), by="hours"))
然后 R> table(weekdays(as.Date(df[,1], TZ="UTC")))
Friday
19
R>
我认为星期五/星期六的误差也可能在润滑下消失,但我倾向于使用基本的R函数。
编辑:证实。
R> lubridate::wday(as.Date(df[,1]), label=TRUE)
[1] Fri Fri Fri Fri Fri Fri Fri Fri Fri Fri Fri Fri Fri Fri
[15] Fri Fri Fri Fri Fri
Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat
R>
我认为这个问题很简单。"润滑"包正是为这类工作而设计的,但问题中的问题似乎只是关于理解"润滑"功能。
OP看到奇怪结果的原因是'df'中的日期没有以明确的格式存储(单位的降序)。这意味着当调用'wday'函数时,它正在应用不正确的转换并误读日期。
为了解决这个问题,OP已经添加了将字符串转换为日期的想法,这是完全正确的。然而,"as"。POSIXlt'函数是一个笨重的工具,'润滑油'包已经有了一个答案:'dmy'函数。下面是它的工作原理:
df$wday <- wday(dmy(df$Date))
df$wday.name <- wday(dmy(df$Date), label=TRUE, abbr=TRUE)
我们在这里做的事情很简单。我们首先将'df$Date'从一组字符串转换为一组日期。'dmy'函数自动解析字符串,查找日,月,年(因此d-m-y)。一旦我们有了正确格式的字符串,我们就可以正确地使用'wday'函数了。
我认为Dinre的答案是最简单的-我发现使用日期比POSIX更不容易出错-但是这里有一个直接的方法来获得正确的结果,同时使用您的日期和时间列。
# Convert your Date variable into a proper Date class
# This is the base-R equivalent of Dinre's dmy()
df$Date2 <- as.Date(df$Date, format = "%d/%m/%Y")
# Paste it together with your Time into a POSIX variable with timezone
# I think "GB" is the correct timezone code for you, but not certain
df$datetime <- as.POSIXct(paste(df$Date2, df$Time), tz = "GB")
# Calculate weekday
wday(df$datetime, label = TRUE)
这样做的好处是,您可以将df$datetime
用于几乎任何其他内容(例如,绘图)并获得一致的结果。如果你真的只打算使用日期,那么Dinre的答案就是你所需要的。