如何从日期

时间:2017-11-27 11:10:09

标签: r

我想以字符串格式从给定日期获取ISO周编号,其中星期一是一周的第一天,包含一年中第一个星期四的星期被视为第一周。< / p>

从其他答案来看,我认为strftime("2017-11-18", format = "%V")最适合我的目的。 但是它不能在Windows上运行。

对于只包含R基础包的替代品的任何建议?

5 个答案:

答案 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")