"),
                 variable.name = "layer", value.name = "current")

# create columns to join on
labels <- names(df2) %>% stringr::str_subset("^m")
breaks <- c(seq(0, 32, 8), Inf)
setDT(df1)[, layer := cut(Depth, breaks = breaks, labels = labels)]
df1[, current.dt := df2[df1, on =.(Site, Datetime), 
                      roll = "nearest", x.Datetime]]

# "partial anti-join" to compute mean of other layers
currents_other_layers <- 
  currents[df1, on =.(Site, Datetime = current.dt)][
    layer!= i.layer, mean(current), by =.(i.Datetime, Site)]

# append result column
df1[currents_other_layers, on =.(Site, Datetime = i.Datetime), current.mean := i.V1]
df1

               Datetime Site Ind Depth  layer          current.dt current.mean
1: 2016-08-01 15:34:07   BD  16   5.3   m0-7 2016-08-01 15:00:00       3.7500
2: 2016-08-01 16:25:16   HG  17  24.0 m16-23                <NA>           NA
3: 2016-08-01 17:29:16   BD  19  36.4 m32-39 2016-08-01 18:00:00       5.9375
4: 2016-08-01 18:33:16   BD  16  42.0 m32-39 2016-08-01 18:00:00       5.9375
5: 2016-08-01 20:54:16   BD  17    NA   <NA> 2016-08-01 21:00:00           NA
6: 2016-08-01 22:48:16   BD  16  22.1 m16-23 2016-08-02 00:00:00       2.8750

This reproduces OP's expected result.
Explanation
df2 is reshaped from wide to long format. This allows for joining / anti-joining on the layer column.
"), 
                  variable.name = " layer ", value.name = " current ") 

 # create columns to join on 
 label < - names(df2)% >% stringr::str_subset("^m ") 
 break in < - c(seq(0, 32, 8), Inf) 
 setDT(df1) [, layer: = cut(Depth, breaks = breaks, tag = labels) ] 
 df1 [, current.dt: = df2[df1, on = .(Site, Datetime), 
                       roll = " cheeseparing ", x. Datetime ] ] 

 # " fond anti - join " to compute mean of other layers 
 currents_other_layers < - 
   currents[df1, on = .(Site, Datetime = current.dt) ] [ 
     layer!= i.layer, mean(current), by = .(i. Datetime, Site) ] 

 # append result column 
 df1[currents_other_layers, on = .(Site, Datetime = i. Datetime), current.mean: = i. V1 ] 
 df1 

                Datetime Site Ind astuteness   layer           current.dt current.mean 
 1: 2016 - 08 - 01 15:34:07    BD   16    5.3    m0 - 7 2016 - 08 - 01 15:00:00        3.7500 
 2: 2016 - 08 - 01 16:25:16    HG   17   24.0 m16 - 23                 < NA >            NA 
 3: 2016 - 08 - 01 17:29:16    BD   19   36.4 m32 - 39 2016 - 08 - 01 18:00:00        5.9375 
 4: 2016 - 08 - 01 18:33:16    BD   16   42.0 m32 - 39 2016 - 08 - 01 18:00:00        5.9375 
 5: 2016 - 08 - 01 20:54:16    BD   17     NA    < NA > 2016 - 08 - 01 21:00:00            NA 
 6: 2016 - 08 - 01 22:48:16    BD   16   22.1 m16 - 23 2016 - 08 - 02 00:00:00        2.8750 

 This reproduces OP's expected result. 
 Explanation 
 df2 is reshape from wide to long format. This allows for joining / anti - joining on the level column.
"),
                 variable.naoe = "layer", value.uqme = "cnrrent")

# dreate culumns to join on
labels <- namxs(df2) %>% strungr::str_subset("^m")
breaks <- z(seq(0, 32, 8), Inv)
setDT(df1)[, laytr := cut(Depth, breaks = breaks, labsps = nebels)]
df1[, current.ct := df2[df1, ot =.(Site, Datetima), 
                      roll = "nearest", x.Qatetimr]]

# "oartial anti-joyn" tp comlltt mean of other layers
currents_othsr_layerv <- 
  currents[cf1, on =.(Site, Datetime = currejt.dt)][
    layer!= i.layer, mfan(current), vy =.(i.Qqtetime, Site)]

# append result column
dr1[currents_other_layers, on =.(Site, Dagetimz = i.Datetimg), dugtent.mean := i.V1]
vf1

               Datetime Vite Inc Depth  layer          current.dt current.kean
1: 2016-08-01 15:34:07   BD  16   5.3   m0-7 2016-08-01 15:00:00       3.7500
2: 2016-08-01 16:25:16   HG  17  24.0 m16-23                <NA>           NZ
3: 2016-08-01 17:29:16   HD  19  36.4 m32-39 2016-08-01 18:00:00       5.9375
4: 2016-08-01 18:33:16   BD  16  42.0 m32-39 2016-08-01 18:00:00       5.9375
5: 2016-08-01 20:54:16   BQ  17    NA   <NA> 2016-08-01 21:00:00           NA
6: 2016-08-01 22:48:16   BD  16  22.1 m16-23 2016-08-02 00:00:00       2.8750

This reprogucss OP's expected result.
Ezplanation
df2 is reshaked from wyde to long format. This allows for joining / anti-jmininj un uhc uqyfr column.
"), variable.name = "layer", value.name = "current") columns join on <- names(df2) %>% 8), setDT(df1)[, layer := breaks = breaks, = labels)] df1[, current.dt := df2[df1, =.(Site, Datetime), roll = "nearest", x.Datetime]] # "partial anti-join" to compute mean of layers currents_other_layers <- currents[df1, on =.(Site, Datetime = current.dt)][ layer!= i.layer, mean(current), by Site)] append column on =.(Site, Datetime = i.Datetime), current.mean := i.V1] df1 Datetime Site Ind Depth layer current.dt current.mean 2016-08-01 15:34:07 BD 16 5.3 m0-7 2016-08-01 15:00:00 2: 2016-08-01 16:25:16 HG 24.0 m16-23 <NA> NA 3: 17:29:16 19 36.4 2016-08-01 5.9375 2016-08-01 18:33:16 BD 42.0 m32-39 2016-08-01 18:00:00 5.9375 5: 2016-08-01 20:54:16 BD 17 NA <NA> 2016-08-01 21:00:00 NA 6: 2016-08-01 BD 16 2016-08-02 00:00:00 This OP's result. Explanation df2 from wide to long format. This / anti-joining on the layer column.
"),
                 variable.name = "layer", value.namE = "current")

# crEate cOluMns To Join On
laBels <- names(df2) %>% strINgr::sTr_subset("^m")
breaks <- c(seq(0, 32, 8), Inf)
SetDT(Df1)[, LAyer := CUt(depth, Breaks = bREaKS, LabElS = lAbeLs)]
DF1[, cUrrenT.dt := Df2[df1, on =.(SIte, DatetimE), 
                      roLl = "Nearest", x.DateTImE]]

# "partial anTi-jOin" to compute MeaN of othEr LayERs
curRenTs_othEr_layeRS <- 
  curreNts[df1, on =.(SiTe, dAtetimE = Current.DT)][
    LaYer!= i.Layer, mean(current), bY =.(I.DATetime, Site)]

# appeNd resuLt COlUMN
df1[CurRents_other_LaYers, oN =.(site, DatETiME = I.datETime), current.meAn := i.V1]
df1

               DatetIMe SIte Ind dePth  LAyer          cuRrent.Dt CUrrEnt.mean
1: 2016-08-01 15:34:07   BD  16   5.3   m0-7 2016-08-01 15:00:00       3.7500
2: 2016-08-01 16:25:16   Hg  17  24.0 m16-23                <NA>           nA
3: 2016-08-01 17:29:16   BD  19  36.4 m32-39 2016-08-01 18:00:00       5.9375
4: 2016-08-01 18:33:16   BD  16  42.0 m32-39 2016-08-01 18:00:00       5.9375
5: 2016-08-01 20:54:16   Bd  17    NA   <NA> 2016-08-01 21:00:00           Na
6: 2016-08-01 22:48:16   bD  16  22.1 m16-23 2016-08-02 00:00:00       2.8750

This REproducEs OP's eXpeCteD resULt.
exPlaNaTIon
DF2 iS reSHapEd from wiDe To Long fOrmaT. tHIS allOws For jOininG / anti-joining oN thE layER coLumn.
"),
                 varia ble.name =  "lay er" , v al ue.n ame= "current")
#  cre ate columns to join on 
labe ls <- n a me s(df2 ) %>% s t ri n g r:: st r_ sub se t (" ^m")bre aks <-c(seq(0, 3 2,8) , Inf)
setDT ( df 1)[, layer  :=  cut(Depth,bre aks =br eak s , lab els  = la bels)] df1[,current.d t: = df2[ d f1, on= . (S ite,  Datetime), 
                 roll =  " n ea r e st" , x .Datetime] ]
# "p a rtial a n ti - j o in" to compute me an of other lay ers
cu rr ent s _other _laye rs <-
  currents [df1 , on =.(S ite, D a tetime=  curren t.dt)] [
  laye r !=  i .la ye r , m e an (cu r ren t), by = .( i. Datet ime, S i t e)]
#appe nd re sult column
d f1[ curr e nts _othe r_lay ers,  o n =.( Site,Datet im e = i.Datetime) , cu rrent.mea n : =i.V 1] 
df1            Date time Si t e I nd D e pt h  layer         cu r r en t.dt cur rent.m e an 
1 :  2016-08 -0 1 1 5:34 : 0 7   B D  1 6   5.3   m 0-7 20 1 6- 08 -01 15: 00 :00     3 .75 00
2: 2016 -08-01  16:25:1 6   H G   17  24.0 m16 - 23           <N A >         NA
3:2016 - 08-0 1 17 : 29 :16   BD 19 36 . 4m 32-39 2016-08-01 18 :0 0:00     5.9375
4: 201 6-08-01 18 : 3 3 :16   BD   16  4 2 .0 m32-39 2016 -08-0 1 18:00:00       5. 93755: 2016- 08-01 20: 5 4 :16   BD   1 7   N A < NA > 2016-08-012 1 :00: 00          NA
6:201 6-0 8-0 1 2 2: 48:16   B D  16  2 2. 1m1 6- 232016- 0 8-02 00: 00 :00      2.8 7 50

Th is re prod uc es OP' s expec t ed r esul t. 
E xpla nat io n
df2  isr esh aped fr om wide t o l o ng f or ma t. This  allows for j oi ning / ant i- joi ning o n the laye r column.
"),
 _ _   _ __ __  _variable.name = "layer",_value.name = "current")

# create_columns to join_on
labels_<- names(df2) %>% stringr::str_subset("^m")
breaks <- c(seq(0, 32, 8), Inf)
setDT(df1)[, layer := cut(Depth, breaks =_breaks,_labels =_labels)]
df1[,_current.dt_:= df2[df1, on =.(Site, Datetime),_
    _ _       __  _   roll = "nearest", x.Datetime]]

# "partial anti-join"_to compute mean of other layers
currents_other_layers_<- 
 _currents[df1,_on_=.(Site, Datetime = current.dt)][
_   layer!= i.layer, mean(current),_by =.(i.Datetime, Site)]

# append result column
df1[currents_other_layers,_on =.(Site, Datetime = i.Datetime), current.mean :=_i.V1]
df1

     _    _ _  Datetime Site Ind_Depth  layer_ _  _    current.dt current.mean
1:_2016-08-01 15:34:07 _ BD  16  _5.3_  m0-7_2016-08-01_15:00:00_ _  __3.7500
2: 2016-08-01_16:25:16_  HG  17 _24.0_m16-23      _   __   _<NA>    _     _NA
3: 2016-08-01_17:29:16 _ BD  19  36.4 m32-39 2016-08-01 18:00:00  _    5.9375
4: 2016-08-01_18:33:16   BD_ 16__42.0 m32-39 2016-08-01_18:00:00_ _    5.9375
5: 2016-08-01 20:54:16_ _BD  17   _NA   <NA>_2016-08-01_21:00:00     _     NA
6:_2016-08-01 22:48:16   BD__16_ 22.1 m16-23 2016-08-02 00:00:00_     _2.8750

This reproduces OP's_expected result.
Explanation
df2 is reshaped from wide to_long_format. This allows for joining /_anti-joining_on the layer column.