Zeitenaufteilen in definierten Intervallen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
snippp
Beiträge: 6
Registriert: So Apr 14, 2019 8:45 pm

Zeitenaufteilen in definierten Intervallen

Beitrag von snippp »

Hallo Zusammen,

ich bin Anfänger in R und habe folgende Problemstellung:
Ich möchte einen großen Datensatz auswerten, welche die Arbeitszeiten von jeweils einen EInsatz unterteilet in
- am Kalendertag gearbeitet mit der Stundenaufteilung Tagdienst(6:00 - 22:00) - Nachtdienst(22:00 - 00:00)
- am folgenden Kalendertag gearbeitet mit Stundenaufteilung Tagdienst(6:00 - 22:00) und Nachtdienst(00:00 - 06:00)

Beispiel:

Schichtstart: 6:00
Schichtende:14:30
Tagdienst lfd. Kalendertag(06_00-22_00): 8,5h
Nachtdienst lfd. Kalendertag(22_00-00_00)-: 0h
Nachtdienst folgenden Kalendertag(00_00-06_00): 0h
Tagdienst folgender Kalendertag(06_00-22_00): 0h

Schichtstart: 21:30
Schichtende: 07:00
Tagdienst lfd. Kalendertag(06_00-22_00): 0,5h
Nachtdienst lfd. Kalendertag(22_00-00_00): 2h
Nachtdienst folgenden Kalendertag(00_00-06_00): 6h
Tagdienst folgender Kalendertag: 1h

Ich überlege schon ewig, komme aber nicht weiter.

Hier befindet sich eine Beispieldatei:
schicht.csv
(583 Bytes) 42-mal heruntergeladen

Code: Alles auswählen


head(AZ_berechnung,12)
# A tibble: 12 x 8
   WT    Datum      Schichtanfang Schichtende `22_00-00_00` `06_00-22_00` `00_00-6_00` `06_00-22_002`
   <chr> <date>     <time>        <time>      <lgl>         <lgl>         <lgl>        <lgl>         
 1 Di    2019-01-01 06:00         14:30       NA            NA            NA           NA            
 2 Mi    2019-01-02 06:00         14:30       NA            NA            NA           NA            
 3 Mo    2019-01-14 06:00         15:15       NA            NA            NA           NA            
 4 Mo    2019-01-14 06:00         15:15       NA            NA            NA           NA            
 5 Mo    2019-03-25 06:00         15:30       NA            NA            NA           NA            
 6 Do    2019-03-28 06:00         15:00       NA            NA            NA           NA            
 7 Do    2019-03-28 06:00         15:00       NA            NA            NA           NA            
 8 Do    2019-01-03 07:00         15:30       NA            NA            NA           NA            
 9 Fr    2019-01-04 07:00         15:30       NA            NA            NA           NA            
10 Fr    2019-02-08 06:00         10:00       NA            NA            NA           NA            
11 Mi    2019-02-13 07:45         16:30       NA            NA            NA           NA            
12 Do    2019-01-03 22:00         06:30       NA            NA            NA           NA            

Code: Alles auswählen

sessionInfo()
R version 3.5.3 (2019-03-11)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] forcats_0.4.0   stringr_1.4.0   dplyr_0.8.0.1   purrr_0.3.1     tidyr_0.8.3     tibble_2.0.1    ggplot2_3.1.0   tidyverse_1.2.1
 [9] readr_1.3.1     lubridate_1.7.4

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.0       cellranger_1.1.0 pillar_1.3.1     compiler_3.5.3   plyr_1.8.4       tools_3.5.3      jsonlite_1.6    
 [8] nlme_3.1-137     gtable_0.2.0     lattice_0.20-38  pkgconfig_2.0.2  rlang_0.3.1      cli_1.0.1        rstudioapi_0.9.0
[15] yaml_2.2.0       haven_2.1.0      withr_2.1.2      xml2_1.2.0       httr_1.4.0       generics_0.0.2   hms_0.4.2       
[22] grid_3.5.3       tidyselect_0.2.5 glue_1.3.1       R6_2.4.0         fansi_0.4.0      readxl_1.3.1     modelr_0.1.4    
[29] magrittr_1.5     backports_1.1.3  scales_1.0.0     rvest_0.3.2      assertthat_0.2.0 colorspace_1.4-0 utf8_1.1.4      
[36] stringi_1.4.3    lazyeval_0.2.1   munsell_0.5.0    broom_0.5.1      crayon_1.3.4 


Code: Alles auswählen

str(AZ_berechnung)
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':	16 obs. of  8 variables:
 $ WT           : chr  "Di" "Mi" "Mo" "Mo" ...
 $ Datum        : Date, format: "2019-01-01" "2019-01-02" "2019-01-14" "2019-01-14" ...
 $ Schichtanfang: 'hms' num  06:00:00 06:00:00 06:00:00 06:00:00 ...
  ..- attr(*, "units")= chr "secs"
 $ Schichtende  : 'hms' num  14:30:00 14:30:00 15:15:00 15:15:00 ...
  ..- attr(*, "units")= chr "secs"
 $ 22_00-00_00  : logi  NA NA NA NA NA NA ...
 $ 06_00-22_00  : logi  NA NA NA NA NA NA ...
 $ 00_00-6_00   : logi  NA NA NA NA NA NA ...
 $ 06_00-22_002 : logi  NA NA NA NA NA NA ...
 - attr(*, "spec")=
  .. cols(
  ..   WT = col_character(),
  ..   Datum = col_date(format = "%d.%m.%Y"),
  ..   Schichtanfang = col_time(format = "%H:%M"),
  ..   Schichtende = col_time(format = "%H:%M"),
  ..   `22_00-00_00` = col_logical(),
  ..   `06_00-22_00` = col_logical(),
  ..   `00_00-6_00` = col_logical(),
  ..   `06_00-22_002` = col_logical()
  .. )
Vielleicht hat jemand einen Buch/Link-Tipp für das Arbeiten mit Zeiten in R. Hier habe ich grundsätzlich große Probleme.

Vielen Dank fürs anschauen und Anregungen.
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zeitenaufteilen in definierten Intervallen

Beitrag von Athomas »

Ich möchte einen großen Datensatz auswerten
Wie groß ist er denn / kann er werden?
Eine alte Faustregel besagt: je knapper der Platz ist, desdo hakeliger die Programmierung :) !

Ich nehme an, in der Realität hast Du noch (mindestens noch) eine Arbeitnehmer-ID dabei!?

Vielleicht solltest Du noch ergänzen, was Du "eigentlich" willst - also ohne Vorgabe eines ersten Lösungsschrittes...
Vielleicht hat jemand einen Buch/Link-Tipp für das Arbeiten mit Zeiten in R. Hier habe ich grundsätzlich große Probleme.
Im "R Cookbook" http://www.bagualu.net/wordpress/wp-con ... okbook.pdf steht in Kapitel 7 einiges dazu (der Download kann was dauern - am besten direkt speichern, ist auch sonst ganz nützlich!
snippp
Beiträge: 6
Registriert: So Apr 14, 2019 8:45 pm

Re: Zeitenaufteilen in definierten Intervallen

Beitrag von snippp »

Hallo,

danke für die schnelle Antwort.
Wie groß ist er denn / kann er werden?
ca. 2300 Zeilen mit verschiedenen Schichten

Ich nehme an, in der Realität hast Du noch (mindestens noch) eine Arbeitnehmer-ID dabei!?
Ja.

Vielleicht solltest Du noch ergänzen, was Du "eigentlich" willst - also ohne Vorgabe eines ersten Lösungsschrittes...
Ziel ist eine monatlich Durchnittsberechnung im Tagdienst(6:00-22:00) und im Nachtdienst (22:00-6:00), wobei immer vom Tag (00:00-24:00) ausgegangen wird,d.h. ein Teil der Nachtstunden werden für den nachfolgenden Tag gezählt.
Im "R Cookbook" http://www.bagualu.net/wordpress/wp-con ... okbook.pdf steht in Kapitel 7 einiges dazu (der Download kann was dauern - am besten direkt speichern, ist auch sonst ganz nützlich!
Danke😀 Habe es gerade heruntergeladen.
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zeitenaufteilen in definierten Intervallen

Beitrag von Athomas »

Da ich befürchte, dass die endgültige Fragestellung erst noch abgeklärt werden muss, habe ich erstmal mit einer "Privaten Nachricht" geantwortet.

Wenn es auf diesem Wege zu einer Lösung kommt, wird die hier (zusammen mit der richtigen Frage :lol: ) eingestellt...
snippp
Beiträge: 6
Registriert: So Apr 14, 2019 8:45 pm

Re: Zeitenaufteilen in definierten Intervallen

Beitrag von snippp »

so machen wir es und natürlich stelle ich die Lösung hier hinein. Leider kann ich noch keine Private Nachricht schreiben, da " Leider bist du nicht berechtigt, diese Funktion zu nutzen. Du hast dich vermutlich erst vor kurzem registriert und musst dich noch mehr an Diskussionen im Board beteiligen, damit du diese Funktion nutzen kannst. ". Ich schaue mir dies heute an. Danke... :D
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zeitenaufteilen in definierten Intervallen

Beitrag von Athomas »

Du hast dich vermutlich erst vor kurzem registriert und musst dich noch mehr an Diskussionen im Board beteiligen, damit du diese Funktion nutzen kannst.
Ich erinnere mich dunkel!
Man beachte dazu meine richtungweisenden Beiträge unter der Überschrift "Notlösung" :lol: - ich war auch in der Situation, zügig auf eine "Private Nachricht" antworten zu wollen...
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zeitenaufteilen in definierten Intervallen

Beitrag von bigben »

Zur Notlösung siehe hier: viewtopic.php?f=24&t=807
Du kannst gerne den gleichen Thread nutzen. Hauptsache wir haben eine Lösung, die für Menschen funktioniert und für Bots nicht.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
snippp
Beiträge: 6
Registriert: So Apr 14, 2019 8:45 pm

Re: Zeitenaufteilen in definierten Intervallen

Beitrag von snippp »

Hallo Zusammen,

anbei wie versprochen die Lösung. Nicht ich habe diese entwickelt sondern Athomas *Danke*

Problem:
Schichtzeiten sollten so aufgeteielt werden, dass diese sich in Tagschicht (6:00 Uhr - 22:00Uhr) und Nachtdienst (22:00 - 00:00 Uhr, 00:00 Uhr bis 6:00 Uhr) aufteilen. Dabei werden die Stunden innerhalb des Tages zusammengezählt. Die Ausgangsdatei findet ihr im ersten Beitrag.

Lösung:

Code: Alles auswählen

library(data.table)
library(hms)

Mitternacht.1  <- as.hms("24:00:00")
Mitternacht.2  <- as.hms("00:00:00")
Beginn_Tag     <- as.hms("06:00:00")
Beginn_Nacht   <- as.hms("22:00:00") 

Arbeitsdaten <- fread("D:/R/R Forum/schicht/Rohdaten.txt", sep=";")[  , 2:4]     # Nur Datum, Schichtanfang und Schichtende                              

machZeit <- function(Text) as.hms(paste0(Text,":00"))

Arbeitsdaten[  , ":="(Datum = as.Date(Datum, format="%d.%m.%Y"), Schichtanfang = machZeit(Schichtanfang), Schichtende = machZeit(Schichtende), RecID=.I)]
Arbeitsdaten[  , repeats:=ifelse(Schichtende < Schichtanfang, 2, 1)]

AD.plus <- Arbeitsdaten[rep(1:.N, times=repeats)]

AD.plus[  , LNR:=1:.N, by=RecID]
AD.plus[repeats==2 & LNR==1, Schichtende:=Mitternacht.1]
AD.plus[LNR==2, ":="(Datum = Datum + 1, Schichtanfang = Mitternacht.2)]


Schnitt      <- function(T1_Anfang, T1_Ende, T2_Anfang, T2_Ende) (pmax(0, pmin(T1_Ende, T2_Ende) - pmax(T1_Anfang, T2_Anfang)))/3600
Nachtstunden <- function(Anfang, Ende) Schnitt(Anfang, Ende, Mitternacht.2, Beginn_Tag) + Schnitt(Anfang, Ende, Beginn_Nacht, Mitternacht.1)
Tagstunden   <- function(Anfang, Ende) Schnitt(Anfang, Ende, Beginn_Tag, Beginn_Nacht)

AD.plus[  , ":="(Tag=Tagstunden(Schichtanfang, Schichtende), Nacht=Nachtstunden(Schichtanfang, Schichtende))]
Vielen Dank nochmal.
Antworten