我想以字符串格式从给定日期获取ISO周编号,其中星期一是一周的第一天,包含一年中第一个星期四的星期被视为第一周。< / p>
从其他答案来看,我认为strftime("2017-11-18", format = "%V")
最适合我的目的。
但是它不能在Windows上运行。
对于只包含R基础包的替代品的任何建议?
答案 0 :(得分:3)
使用包lubridate
它有一个函数isoweek()
,它为您提供给定日期的ISOWeek
lubridate::isoweek("2017-11-18")
[1] 46
现在你只想使用base packege。这是来自lubridate的ISO周代码
function (x)
{
xday <- make_datetime(year(x), month(x), day(x))
dn <- 1 + (wday(x) + 5)%%7
nth <- xday + ddays(4 - dn)
jan1 <- make_datetime(year(nth), 1, 1)
1L + as.integer(difftime(nth, jan1, units = "days"))%/%7L
}
我们可以把它变成只使用基础包的东西。
myIsoweek <- function (x)
{
dateList <- as.list(strsplit(as.character(as.Date(x)),split = "-")[[1]])
names(dateList) <- c("year","month","day")
weekday <- as.POSIXlt(x)[["wday"]] + 1
xday <- ISOdate(dateList$year, dateList$month, dateList$day)
dn <- 1 + (weekday + 5)%%7
nth <- xday + 86400*(4 - dn)
jan1 <- ISOdate(format(nth,format = "%Y"), 1, 1)
1L + as.integer(difftime(nth, jan1, units = "days"))%/%7L
}
答案 1 :(得分:2)
data.table
具有isoweek
的实现,您可能只想移植它(使用base
功能很容易复制)
# data.table approach:
isoweek <- function(x) {
x = as.IDate(x) # number of days since 1 Jan 1970 (a Thurs)
nearest_thurs = as.IDate(7L * (as.integer(x + 3L) %/% 7L))
year_start <- as.IDate(format(nearest_thurs, '%Y-01-01'))
1L + (nearest_thurs - year_start) %/% 7L
}
移植为严格的base
:
isoweek <- function(x) {
x = as.Date(x) # number of days since 1 Jan 1970 (a Thurs)
nearest_thurs = as.Date(7L * (as.integer(x + 3L) %/% 7L), origin = '1970-01-01')
year_start <- as.Date(format(nearest_thurs, '%Y-01-01'))
1L + (nearest_thurs - year_start) %/% 7L
}
答案 2 :(得分:1)
Python日期时间库具有用于获取ISO年,周号和周日的本机函数:https://docs.python.org/3/library/datetime.html#datetime.date.isocalendar。它会返回包含所有三个值的元组,因此,如果您只想拥有星期数,则只需选择第二个元素。
示例:
from datetime import datetime
// Create a datetime object from your string
my_date = datetime.strptime('2017-11-18', '%Y-%m-%d')
// Get the tuple of ISO date values from your datetime object
my_iso_tuple = my_date.isocalendar()
// Get the ISO week number
my_iso_week_number = my_iso_tuple[1]
答案 3 :(得分:0)
我相信System.gc()
应该适用于Windows。
答案 4 :(得分:0)
这应该有效
format(as.Date("2017-02-015"),"%W")