【问题标题】:Get date (yyyy-mm-dd) from dataframe containing week number, day of the week从包含星期数、星期几的数据框中获取日期(yyyy-mm-dd)
【发布时间】:2021-07-30 14:20:48
【问题描述】:

花了2天,我几乎放弃了。

我拥有的数据框是

tibble[,5] [364 x 5] (S3: tbl_df/tbl/data.frame)
 $ Week        : int [1:364] 1 1 1 1 1 1 1 2 2 2 ...
 $ WeekStarting: chr [1:364] "1/3/2016" "1/3/2016" "1/3/2016" "1/3/2016" ...
 $ day         : chr [1:364] "Monday" "Tuesday" "Wednesday" "Thursday" ...
 $ max_temp    : num [1:364] 46.9 45 41 45 59 ...
 $ Date        : POSIXct[1:364], format: "2016-01-04" "2016-01-05" "2016-01-06" "2016-01-07" ...

我在做什么

df_weather_daily$Date <- parse_date_time(paste(2016, df_weather_daily$Week, df_weather_daily$day, 1, sep="/"),'Y/W/U')

第一周的日期很好。周从 2016 年 1 月 3 日开始,一天是星期一,所以日期是 2016 年 1 月 4 日。当周数为 2 时,日期字段从 2016-01-04 开始重复。所以日期基本上从 03 到 09 循环。

如何解决此问题以获取全年的日期?谢谢!

【问题讨论】:

  • 请提供对 dput 的代表调查
  • 查看此处提供可重现的示例 stackoverflow.com/help/minimal-reproducible-example>

标签: r date lubridate


【解决方案1】:

假设您只有以下两条日期信息:一年中的哪一天和一年,然后从创建您的 WeekStarting 变量开始:

1)

注意:使用%U 假设您的一周从星期日开始。如果它从星期一开始,请改用%W

yr <- "2016"
df$WeekStarting <- as.Date(paste0(yr, sprintf("%02d", df$Week), "00"), "%Y%U%w")           

head(df$WeekStarting, 8)
[1] "2016-01-03" "2016-01-03" "2016-01-03" "2016-01-03" "2016-01-03" "2016-01-03"
[7] "2016-01-03" "2016-01-10"

如果您已经有问题中发布的格式的WeekStarting,那么您可以从这里开始:

2)

dow <- setNames(0:6, c("Sunday", 
                       "Monday", 
                       "Tuesday", 
                       "Wednesday", 
                       "Thursday", 
                       "Friday", 
                       "Saturday"))

# WeekStarting is character, like in your question
within(df, Date <- as.Date(WeekStarting, "%m/%d/%Y") + dow[day]) 

# If you started in Step 1
within(df, Date <- WeekStarting + dow[day])  

输出

   Week       day WeekStarting       Date
1     1    Sunday   2016-01-03 2016-01-03
2     1    Monday   2016-01-03 2016-01-04
3     1   Tuesday   2016-01-03 2016-01-05
4     1 Wednesday   2016-01-03 2016-01-06
5     1  Thursday   2016-01-03 2016-01-07
6     1    Friday   2016-01-03 2016-01-08
7     1  Saturday   2016-01-03 2016-01-09
8     2    Sunday   2016-01-10 2016-01-10
9     2    Monday   2016-01-10 2016-01-11
10    2   Tuesday   2016-01-10 2016-01-12
11    2 Wednesday   2016-01-10 2016-01-13
12    2  Thursday   2016-01-10 2016-01-14
13    2    Friday   2016-01-10 2016-01-15
14    2  Saturday   2016-01-10 2016-01-16
15    3    Sunday   2016-01-17 2016-01-17
16    3    Monday   2016-01-17 2016-01-18
17    3   Tuesday   2016-01-17 2016-01-19
18    3 Wednesday   2016-01-17 2016-01-20
19    3  Thursday   2016-01-17 2016-01-21
20    3    Friday   2016-01-17 2016-01-22
21    3  Saturday   2016-01-17 2016-01-23

数据

df <- structure(list(Week = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), day = c("Sunday", 
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", 
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", 
"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
"Friday", "Saturday")), class = "data.frame", row.names = c(NA, 
-21L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多