Rapporteket / norgast

R-pakke med resultatrapporter for NoRGast
0 stars 1 forks source link

Feil i utvalg av dato #2

Closed areedv closed 6 years ago

areedv commented 6 years ago

Etter at data er hentet fra databasen, ved filtrering på dato blir ikke endepunktet (siste dag) med videre. Årsaken er at de data som matches i filteret (utilsiktet) blir gitt ulik tidssone. Faktisk feil er større i sommerhalvåret enn i vinterhalvåret :-)

areedv commented 6 years ago

Reproduksjon av feilen er vist under. Alle kommandoer er kjørt på Rapporteket TEST. Av hensyn til forenkling er det bare benyttet en øvre (datoTil) og ingen nedre (datoFra) begrensning av dato.

Angi register, databasemotor og sluttdato:

registryName <- "norgast"
dbType <- "mysql"
datoTil <- "2017-07-31"

Lag databasespørring:

query <- paste0("SELECT
                   a.OpDato
                 FROM
                   AlleVariablerNum a
                 INNER JOIN
                   ForlopsOversikt f
                 ON
                   a.ForlopsID = f.ForlopsID
                 WHERE
                   f.HovedDato <= \'", datoTil, "'")

Hent data:

RegData <- rapbase::LoadRegData(registryName, query, dbType)

Lag ny variabel OperasjonsDato slik det er gjort i NorgastPreprosesser.R. Sjekk på maxverdi og klasse på opprinnelig og ny variabel er også vist:

RegData$OperasjonsDato <- as.POSIXlt(RegData$OpDato, format="%Y-%m-%d")

max(RegData$OpDato)
[1] "2017-07-31"
class(RegData$OpDato)
[1] "Date"

max(RegData$OperasjonsDato)
[1] "2017-07-31 UTC"
class(RegData$OperasjonsDato)
[1] "POSIXlt" "POSIXt"

Maksimumsverdi stemmer med den som er oppgitt i spørringen. Legg merke til at opprinnelig variabel er av klassen Date og at tidssone ikke er angitt. Ved konvertering til klassen POSIXlt benyttes default tidssone UTC.

Det neste er en (ekstra) filtrering på angitt datobegrensning hentet fra NorgastLibUtvalg.R:

indDato <- which(RegData$OperasjonsDato <= as.POSIXlt(datoTil))

length(RegData$OperasjonsDato)
[1] 14574
length(indDato)
[1] 14554

max(RegData$OperasjonsDato[indDato])
[1] "2017-07-30 UTC"

Selv om datobegrensningen er den samme som i opprinnelig spørring mot databasen (og at man da forventer at ingen verdier filtreres ut) så tas det i dette tilfellet likevel vekk 20 observasjoner (som alle har Operasjonsdato 2017-07-31, ikke vist). Årsaken ligger i ulik tidssone for de verdier som sammenholdes i filteret over:

as.POSIXlt(datoTil)
[1] "2017-07-31 CEST"
kevinthon commented 6 years ago

Har faset ut posixlt og erstattet med Date i NoRGast i commit 180de771