Commit | Line | Data |
---|---|---|
25b75559 | 1 | #' dateIndexToInteger |
3d69ff21 | 2 | #' |
25b75559 | 3 | #' Transform a (potential) date index into an integer (relative to data) |
3d69ff21 BA |
4 | #' |
5 | #' @param index Date (or integer) index | |
6 | #' @param data Object of class \code{Data} | |
7 | #' | |
8 | #' @export | |
9 | dateIndexToInteger = function(index, data) | |
10 | { | |
98e958ca | 11 | #works on integers too: trust input |
3d69ff21 BA |
12 | if (is.numeric(index)) |
13 | index = as.integer(index) | |
3d69ff21 | 14 | if (is.integer(index)) |
98e958ca BA |
15 | return (index) |
16 | ||
09cf9c19 | 17 | if (inherits(index, "Date") || is.character(index)) |
3d69ff21 | 18 | { |
44a9990b | 19 | tryCatch(indexAsDate <- as.Date(index), error=function(e) stop("Unrecognized index format")) |
3d69ff21 | 20 | #TODO: tz arg to difftime ? |
44a9990b BA |
21 | integerIndex <- round( as.numeric( |
22 | difftime(indexAsDate, as.Date(data$getTime(1)[1])) ) ) + 1 | |
23 | if (integerIndex >= 1 && integerIndex <= data$getSize()) | |
25b75559 | 24 | return (integerIndex) |
3d69ff21 BA |
25 | stop("Date outside data range") |
26 | } | |
27 | stop("Unrecognized index format") | |
28 | } | |
29 | ||
25b75559 | 30 | #' integerIndexToDate |
09cf9c19 | 31 | #' |
25b75559 | 32 | #' Transform an integer index to date index (relative to data) |
09cf9c19 BA |
33 | #' |
34 | #' @param index Date (or integer) index | |
35 | #' @param data Object of class \code{Data} | |
36 | #' | |
37 | #' @export | |
38 | integerIndexToDate = function(index, data) | |
39 | { | |
98e958ca BA |
40 | #works on dates too: trust input |
41 | if (is.character(index)) | |
42 | index = as.Date(index) | |
a66a84b5 | 43 | if (is(index,"Date")) |
98e958ca BA |
44 | return (index) |
45 | ||
09cf9c19 BA |
46 | index = index[1] |
47 | if (is.numeric(index)) | |
48 | index = as.integer(index) | |
49 | if (!is.integer(index)) | |
a66a84b5 | 50 | stop("'index' should be a date or integer") |
09cf9c19 BA |
51 | as.Date( data$getTime(index)[1] ) |
52 | } | |
53 | ||
25b75559 | 54 | #' getSimilarDaysIndices |
3d69ff21 | 55 | #' |
4e25de2c | 56 | #' Find similar days indices in the past. |
3d69ff21 BA |
57 | #' |
58 | #' @param index Day index (numeric or date) | |
59 | #' @param limit Maximum number of indices to return | |
4e25de2c | 60 | #' @param same_season Should the indices correspond to day in same season? |
9db234c5 | 61 | #' @param data Dataset is required for a search in same season |
3d69ff21 BA |
62 | #' |
63 | #' @export | |
9db234c5 | 64 | getSimilarDaysIndices = function(index, limit, same_season, data=NULL) |
3d69ff21 BA |
65 | { |
66 | index = dateIndexToInteger(index) | |
67 | ||
a866acb3 | 68 | #TODO: mardi similaire à lundi mercredi jeudi aussi ...etc ==> "isSimilarDay()..." |
3d69ff21 BA |
69 | if (!same_season) |
70 | { | |
71 | #take all similar days in recent past | |
72 | nb_days = min( (index-1) %/% 7, limit) | |
73 | return ( rep(index,nb_days) - 7*seq_len(nb_days) ) | |
74 | } | |
75 | ||
9db234c5 | 76 | #Look for similar days in similar season |
a866acb3 BA |
77 | nb_days = min( (index-1) %/% 7, limit) |
78 | i = index - 7 | |
3d69ff21 | 79 | days = c() |
a866acb3 | 80 | month_ref = as.POSIXlt(data$getTime(index)[1])$mon + 1 |
3d69ff21 BA |
81 | while (i >= 1 && length(days) < limit) |
82 | { | |
a866acb3 | 83 | if (isSameSeason(as.POSIXlt(data$getTime(i)[1])$mon + 1, month_ref)) |
3d69ff21 | 84 | days = c(days, i) |
a866acb3 | 85 | i = i-7 |
3d69ff21 | 86 | } |
a866acb3 BA |
87 | return ( days ) |
88 | } | |
3d69ff21 | 89 | |
a866acb3 BA |
90 | #TODO: use data... 12-12-1-2 CH, 3-4-9-10 EP et le reste NP |
91 | isSameSeason = function(month, month_ref) | |
92 | { | |
93 | if (month_ref %in% c(11,12,1,2)) | |
94 | return (month %in% c(11,12,1,2)) | |
95 | if (month_ref %in% c(3,4,9,10)) | |
96 | return (month %in% c(3,4,9,10)) | |
97 | return (month %in% c(5,6,7,8)) | |
3d69ff21 | 98 | } |
25b75559 | 99 | |
a866acb3 BA |
100 | #TODO: |
101 | #distinction lun-jeudi, puis ven, sam, dim | |
102 | #isSameDay = function(day, day_ref) | |
103 | #{ | |
104 | # if (day_ref == | |
105 | ||
98e958ca BA |
106 | #' getNoNA2 |
107 | #' | |
108 | #' Get indices in data of no-NA series followed by no-NA, within [first,last] range. | |
109 | #' | |
110 | #' @param data Object of class Data | |
111 | #' @param first First index (included) | |
112 | #' @param last Last index (included) | |
113 | #' | |
114 | #' @export | |
115 | getNoNA2 = function(data, first, last) | |
116 | { | |
117 | (first:last)[ sapply(first:last, function(i) | |
118 | !any( is.na(data$getCenteredSerie(i)) | is.na(data$getCenteredSerie(i+1)) ) | |
119 | ) ] | |
120 | } |