Как суммировать количество дней данных за несколько лет? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть данные, похожие на это.Я хотел бы задать единовременную сумму дня (я не уверен, что слово «единовременная сумма» является правильным или нет) и создать новый столбец «дата», чтобы единственная сумма в новом столбце суммировала данные за 3 года в порядке возрастания.

    year  month day
    2011    1   5
    2011    2   14
    2011    8   21
    2012    2   24
    2012    3   3
    2012    4   4
    2012    5   6
    2013    2   14
    2013    5   17
    2013    6   24

Я сделал этот код, но результат был неправильным, и он слишком длинный.Февраль не считается правильно, поскольку в феврале всего 28 дней.Есть ли более короткие пути?

    cday <- function(data,syear=2011,smonth=1,sday=1){
       year <- data[1]
      month <- data[2]
      day <- data[3]
      cmonth <- c(0,31,28,31,30,31,30,31,31,30,31,30,31)
      date <- (year-syear)*365+sum(cmonth[1:month])+day
      for(yr in c(syear:year)){
      if(yr==year){
      if(yr%%4==0&&month>2){date<-date+1}
       }else{
         if(yr%%4==0){date<-date+1}
         }
       }
      return(date)
    }
   op10$day.no <- apply(op10[,c("year","month","day")],1,cday)



I expect the result like this:

    year  month day  date
    2011    1   5     5
    2011    1   14    14
    2011    1   21    21
    2011    1   24    24
    2011    2   3     31
    2011    2   4     32
    2011    2   6     34
    2011    2   14    42
    2011    2   17    45
    2011    2   24    52

Спасибо за помощь !!

1 Ответ

3 голосов
/ 02 апреля 2019

Используйте Date классы. Даты и время сложны, ищите инструменты, чтобы сделать это для вас, а не писать свои собственные. Выберите то, что вы хотите:

df$date = with(df, as.Date(paste(year, month, day, sep = "-")))

df$julian_day = as.integer(format(df$date, "%j"))
df$days_since_2010 = as.integer(df$date - as.Date("2010-12-31"))

df
#    year month day       date julian_day days_since_2010
# 1  2011     1   5 2011-01-05          5               5
# 2  2011     2  14 2011-02-14         45              45
# 3  2011     8  21 2011-08-21        233             233
# 4  2012     2  24 2012-02-24         55             420
# 5  2012     3   3 2012-03-03         63             428
# 6  2012     4   4 2012-04-04         95             460
# 7  2012     5   6 2012-05-06        127             492
# 8  2013     2  14 2013-02-14         45             776
# 9  2013     5  17 2013-05-17        137             868
# 10 2013     6  24 2013-06-24        175             906
# using this data
df = read.table(text = "year  month day
    2011    1   5
    2011    2   14
    2011    8   21
    2012    2   24
    2012    3   3
    2012    4   4
    2012    5   6
    2013    2   14
    2013    5   17
    2013    6   24", header = TRUE)

Это все использует базу R. Если вы часто обрабатываете дату и время, вы также можете посмотреть пакет lubridate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...