r date lubridate

Transformar objeto año/semana a fecha



date lubridate (2)

Antes de convertir año-semana a una fecha, debe especificar un día de la semana, pero lo más importante es asegurarse de cuál de las diferentes convenciones se está utilizando.

La función strptime() Base R conoce 3 definiciones para la semana del año (pero solo admite 2 de ellas en la entrada) y 2 definiciones para los números del día de la semana, vea ?strptime :

Semana del año

  • Convención de los Estados Unidos : Semana del año como número decimal (00–53) usando el domingo como primer día 1 de la semana (y típicamente con el primer domingo del año como día 1 de la semana 1): %U

  • Convención del Reino Unido : Semana del año como número decimal (00–53) usando el lunes como primer día de la semana (y típicamente con el primer lunes del año como día 1 de la semana 1): %W

  • Definición de ISO 8601 : Semana del año como número decimal (01–53) como se define en ISO 8601. Si la semana (comenzando el lunes) que contiene el 1 de enero tiene cuatro o más días en el nuevo año, entonces se considera la semana 1. De lo contrario, es la última semana del año anterior, y la próxima semana es la semana 1: %V que se acepta pero se ignora en la entrada.
    Tenga en cuenta que también hay un año basado en la semana ( %G y %g ) que se utilizará con %V ya que puede diferir del año calendario ( %Y y %y ).

Día de la semana numérico

  • Día de la semana como un número decimal (1–7, el lunes es 1): %u
  • Día de la semana como número decimal (0–6, el domingo es 0): %w
  • Curiosamente, no hay formato para el caso. El domingo se cuenta como el día 1 de la semana.

Convertir año-semana-día con las diferentes convenciones

Si agregamos el día 1 a la cadena y usamos los diferentes formatos, obtenemos

as.Date("2015101", "%Y%U%u") # [1] "2015-03-09" as.Date("2015101", "%Y%U%w") # [1] "2015-03-09" as.Date("2015101", "%Y%W%u") # [1] "2015-03-09" as.Date("2015101", "%Y%W%w") # [1] "2015-03-09" as.Date("2015101", "%G%V%u") # [1] NA

Para los formatos entre semana %u y %w obtenemos el mismo resultado porque el día 1 es el lunes en ambas convenciones (pero ten cuidado cuando se trata de domingos).

Para 2015, la definición de EE. UU. Y Reino Unido para la semana del año coincide, pero esto no es cierto para todos los años, por ejemplo, no para 2001, 2007 y 2018:

as.Date("2018101", "%Y%U%u") #[1] "2018-03-12" as.Date("2018101", "%Y%W%u") #[1] "2018-03-05"

Los especificadores de formato ISO 8601 no son compatibles con la entrada. Por lo tanto, había creado el paquete ISOweek hace algunos años:

ISOweek::ISOweek2date("2015-W10-1") #[1] "2015-03-02"

Editar: uso del jueves para asociar una semana con un mes

Como se mencionó anteriormente, debe especificar un día de la semana para obtener una fecha de calendario completa. Esto también es necesario si las fechas deben agregarse un mes más tarde.

Si no se especifica ningún día de la semana y si se supone que las fechas se deben agregar por mes más adelante, puede tomar el jueves de cada semana como día de referencia (siguiendo una sugerencia de djhurio ). Esto garantiza que toda la semana se asigne al mes al que pertenece la mayoría de los días de la semana.

Por ejemplo, tomar el domingo como día de referencia volvería

ISOweek::ISOweek2date("2015-W09-7")

[1] "2015-03-01"

que en consecuencia asociaría toda la semana al mes de marzo, aunque solo un día de la semana pertenece a marzo, mientras que los otros 6 días pertenecen a febrero. Tomar el jueves como día de referencia devolverá una fecha en febrero:

ISOweek::ISOweek2date("2015-W09-4")

[1] "2015-02-26"

La cadena contiene ''AÑO SEMANA'' y quiero transformarla con parse_date_time() en un objeto de fecha, pero no puedo hacer que el código funcione:

parse_date_time(c("201510"), "YW")

No tengo que usar lubridate , también pueden ser otros paquetes.


Sí, el paquete ISOweek hace esto

ISOweek::ISOweek2date(isoWeek)

pero para la otra dirección, revise también el paquete lubridate más lubridate

ISOweek::date2ISOweek(yourDate) lubridate::isoweek(ymd(yourDate))