From 53dc8d6d3c7088a18c2c326cece88a099039c8a7 Mon Sep 17 00:00:00 2001
From: Peter Luenenschloss <peter.luenenschloss@ufz.de>
Date: Tue, 26 May 2020 16:05:17 +0200
Subject: [PATCH] added shifting method to dataprocessing tools

---
 saqc/funcs/proc_functions.py | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/saqc/funcs/proc_functions.py b/saqc/funcs/proc_functions.py
index ba6415a90..2f51279ef 100644
--- a/saqc/funcs/proc_functions.py
+++ b/saqc/funcs/proc_functions.py
@@ -130,9 +130,6 @@ def proc_resample(data, field, flagger, freq, func=np.mean, max_invalid_total_d=
     if empty_intervals_flag is None:
         empty_intervals_flag = flagger.BAD
 
-    if func == "shift":
-        datcol = shift2Freq(datcol, method, freq, fill_value=np.nan)
-        flagscol = shift2Freq(flagscol, method, freq, fill_value=empty_intervals_flag)
 
     else:
         datcol = aggregate2Freq(datcol, method, freq, func, fill_value=np.nan,
@@ -147,6 +144,35 @@ def proc_resample(data, field, flagger, freq, func=np.mean, max_invalid_total_d=
     return data, flagger
 
 
+@register
+def proc_shift(data, field, flagger, freq, drop_flags=None, empty_intervals_flag=None):
+    # Note: all data nans get excluded defaultly from shifting. I drop_flags is None - all BAD flagged values get
+    # excluded as well.
+    data = data.copy()
+    datcol = data[field]
+    flagscol = flagger.getFlags(field)
+
+    if empty_intervals_flag is None:
+        empty_intervals_flag = flagger.BAD
+    if drop_flags is None:
+        drop_flags = flagger.BAD
+
+    drop_flags = toSequence(drop_flags)
+    drop_mask = pd.Series(False, index=datcol.index)
+    for f in drop_flags:
+        drop_mask |= flagger.isFlagged(field, flag=f)
+    drop_mask |= datcol.isna()
+    datcol[drop_mask] = np.nan
+    datcol.dropna(inplace=True)
+    flagscol.drop(drop_mask[drop_mask].index, inplace=True)
+
+    datcol = shift2Freq(datcol, method, freq, fill_value=np.nan)
+    flagscol = shift2Freq(flagscol, method, freq, fill_value=empty_intervals_flag)
+    data[field] = datcol
+    reshaped_flagger = flagger.initFlags(datcol).setFlags(field, flag=flagscol, force=True, **kwargs)
+    flagger = flagger.slice(drop=field).merge(reshaped_flagger)
+    return data, flagger
+
 @register
 def proc_transform(data, field, flagger, func, **kwargs):
     data = data.copy()
-- 
GitLab