Можете ли вы округлить дату до 1-го или 15-го числа в зависимости от дня месяца, используя r? - PullRequest
0 голосов
/ 15 февраля 2020

В следующем фрагменте кода я генерирую дату на основе:

  1. извлечения первой даты из строки символов, которая имеет одну или несколько дат
  2. с добавлением цифры c значение (время выполнения) до этой даты, чтобы получить новую дату

Что я пытаюсь сделать, так это теперь сделать итоговую дату 15-го числа месяца или 1-го числа месяца. Это можно сделать, сказав, что «если день месяца 15-го числа или более, сделайте дату 15-го числа указанного месяца, если она меньше 15, то сделайте дату 1-го числа указанного месяца»)

Я гораздо лучше знаком с SQL, но не совсем уверен, как сделать это самым простым способом в R

Код:

AAR_Combined_w_LL$newvalue <-mdy(substr(AAR_Combined_w_LL$order_cutoffs,0,10)) + AAR_Combined_w_LL$lead_time

Пример данных:

                 season article_number                    order_cutoffs amount_of_limited_order_cut_offs retail_intro_date lead_time
1 adidas Fall/Winter 2020         GI7954 12/17/2019,01/14/2020,02/25/2020                                3        2020-07-01       105
2 adidas Fall/Winter 2020         GI7955 12/17/2019,01/14/2020,02/25/2020                                3        2020-07-01       105
3 adidas Fall/Winter 2020         P82146                       12/17/2019                                1        2020-06-01        75
4 adidas Fall/Winter 2020         S86676                       12/17/2019                                1        2020-06-01        75
5 adidas Fall/Winter 2020         P82145                       12/17/2019                                1        2020-06-01        75
6 adidas Fall/Winter 2020         S86673                       12/17/2019                                1        2020-06-01        75
  1st_Booking_Deadline   1st_BW_Retail_Windows 2nd_Booking_Deadline   2nd_BW_Retail_Windows 3rd_Booking_Deadline 3rd_BW_Retail_Windows
1           2019-12-06 2020-07-01 - 2020-08-01           2020-01-24 2020-09-01 - 2020-11-01                                           
2           2019-12-06 2020-07-01 - 2020-08-01           2020-01-24 2020-09-01 - 2020-11-01                                           
3           2019-12-06 2020-06-01 - 2020-11-01                                                                                        
4           2019-12-06 2020-06-01 - 2020-11-01                                                                                        
5           2019-12-06 2020-06-01 - 2020-11-01                                                                                        
6           2019-12-06 2020-06-01 - 2020-11-01                                                                                        
  4th_Booking_Deadline 4th_BW_Retail_Windows 5th_Booking_Deadline 5th_BW_Retail_Windows            Booking_Deadlines Booking_Deadline_Intervals
1                                                                                       2019-12-06, 2020-01-24, , ,                           2
2                                                                                       2019-12-06, 2020-01-24, , ,                           2
3                                                                                                 2019-12-06, , , ,                        NULL
4                                                                                                 2019-12-06, , , ,                        NULL
5                                                                                                 2019-12-06, , , ,                        NULL
6                                                                                                 2019-12-06, , , ,                        NULL
    newvalue
1 2020-03-31
2 2020-03-31
3 2020-03-01
4 2020-03-01
5 2020-03-01
6 2020-03-01

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Мы можем использовать ifelse

library(lubridate)
day(x) <- ifelse(day(x) > 15, 15, 1)
x
#[1] "2020-03-15" "2020-03-15" "2020-03-01" "2020-03-01" "2020-03-01"

Или с case_when

day(x) <- case_when(day(x) > 15 ~ 15, TRUE ~ 1)

Или с использованием base R

day(x) <- ifelse(as.integer(format(x, "%d")) > 15, 15, 1)

Или другой вариант - gsubfn для изменения строки символов

library(gsubfn)
as.Date(gsubfn("(\\d+)$", ~ ifelse(as.numeric(x) > 15, 15, 1), as.character(x)))
#[1] "2020-03-15" "2020-03-15" "2020-03-01" "2020-03-01" "2020-03-01"

data

x <- as.Date(c('2020-03-31','2020-03-31','2020-03-01','2020-03-01','2020-03-01'))
1 голос
/ 15 февраля 2020

Вы можете получить день, сравнить и назначить значение на его основе.

library(lubridate)
x <- as.Date(c('2020-03-31','2020-03-31','2020-03-01','2020-03-01','2020-03-01'))

day(x) <- c(1, 15)[(day(x) >= 15) + 1]

Это еще один способ написания

day(x) <- ifelse(day(x) >= 15, 15, 1)
x
#[1] "2020-03-15" "2020-03-15" "2020-03-01" "2020-03-01" "2020-03-01"
...