ClearAll[prvsNdys1a];
prvsNdys1[data_, numdays_: 90, basedate_: DateList[], offset_: {0, "Year"}] :=
With[{dtrange = DateRange[DatePlus[Take[basedate, 3], offset],
DatePlus[Take[basedate, 3], {offset, {-numdays + 1, "Day"}}], {-1, "Day"}]},
Select[data, MemberQ[dtrange, First[#]] &]];
or
ClearAll[prvsNdys1b];
prvsNdys1b[data_, numdays_: 90, basedate_: DateList[], offset_: {0, "Year"}] :=
With[{at1 = AbsoluteTime[DatePlus[Take[basedate, 3], offset]],
at2 = AbsoluteTime[ DatePlus[Take[basedate, 3], {offset, {-numdays + 1, "Day"}}]]},
Select[data, (at2 <= AbsoluteTime[#[[1]]] <= at1 &)]];
Example data:
dates = With[{first = Take[DateList[], 3]},
DateRange[first, DatePlus[first, {-5 365, "Day"}], {-1, "Day"}]];
datalst = Transpose@{Sort@dates, Range[5 365 + 1],
RandomChoice[{"Y", "N"}, {5 365 + 1}]};
datalst[[;; 4]]
(*{{{2008, 3, 18}, 1, "Y"}, {{2008, 3, 19}, 2, "Y"}, {{2008, 3, 20}, 3, "Y"},
{{2008, 3, 21}, 4, "N"}} *)
Usage examples:
Last 5 days:
prvsNdys1a[datalst, 5]
(* {{{2013, 3, 13}, 1822, "Y"}, {{2013, 3, 14}, 1823, "Y"},
{{2013, 3, 15}, 1824, "Y"}, {{2013, 3, 16}, 1825, "N"},
{{2013, 3, 17}, 1826, "N"}}*)
Last 5 days and the corresponding days in previous 2 months:
prvsNdys1a[datalst, 5, DateList[], {-#, "Month"}] & /@ {0, 1, 2}
(* {{{{2013, 3, 13}, 1822, "Y"}, {{2013, 3, 14}, 1823, "Y"},
{{2013, 3, 15}, 1824, "Y"}, {{2013, 3, 16}, 1825, "N"},
{{2013, 3, 17}, 1826, "N"}},
{{{2013, 2, 13}, 1794, "Y"}, {{2013, 2, 14}, 1795, "N"},
{{2013, 2, 15}, 1796, "N"}, {{2013, 2, 16}, 1797, "N"},
{{2013, 2, 17}, 1798, "N"}},
{{{2013, 1, 13}, 1763, "N"}, {{2013, 1, 14}, 1764, "Y"},
{{2013, 1, 15}, 1765, "N"}, {{2013, 1, 16}, 1766, "N"},
{{2013, 1, 17}, 1767, "Y"}}} *)
Last 3 days and corresponding days in the previous 3 years:
prvsNdys1a[datalst, 3, DateList[], {-#, "Year"}] & /@ Range[0, 4]
(*{{{{2013, 3, 15}, 1824, "Y"}, {{2013, 3, 16}, 1825, "N"}, {{2013, 3, 17}, 1826,"N"}},
{{{2012, 3, 15}, 1459, "Y"}, {{2012, 3, 16}, 1460, "Y"},{{2012, 3, 17}, 1461, "Y"}},
{{{2011, 3, 15}, 1093, "Y"}, {{2011, 3, 16}, 1094, "N"},{{2011, 3, 17}, 1095, "N"}},
{{{2010, 3, 15}, 728, "N"}, {{2010, 3, 16}, 729, "Y"},{{2010, 3, 17}, 730, "Y"}},
{{{2009, 3, 15}, 363, "N"}, {{2009, 3, 16}, 364, "Y"}, {{2009, 3, 17}, 365, "Y"}}}*)
Alternative methods using Pick
or Cases
instead of Select
:
Using Pick
:
ClearAll[prvsNdys2a];
prvsNdys2a[data_, numdays_: 90, basedate_: DateList[], offset_: {0, "Year"}] :=
With[{dtrange = DateRange[DatePlus[Take[basedate, 3], offset],
DatePlus[Take[basedate, 3], {offset, {-numdays + 1, "Day"}}], {-1, "Day"}]},
Pick[data, MemberQ[dtrange, #] & /@ First /@ data]];
or
ClearAll[prvsNdys2b];
prvsNdys2b[data_, numdays_: 90, basedate_: DateList[], offset_: {0, "Year"}] :=
With[{at1 =UnitStep[ AbsoluteTime[DatePlus[Take[basedate, 3], offset]] -
AbsoluteTime /@ First /@ data],
at2 = UnitStep[ AbsoluteTime /@ First /@ data -
AbsoluteTime[DatePlus[Take[basedate, 3], {offset, {-numdays + 1, "Day"}}]] ]},
Pick[data, at1 at2, 1]];
Using Cases
:
ClearAll[prvsNdys3a];
prvsNdys3a[data_, numdays_: 90, basedate_: DateList[], offset_: {0, "Year"}] :=
With[{dtrange = DateRange[DatePlus[Take[basedate, 3], offset],
DatePlus[Take[basedate, 3], {offset, {-numdays + 1, "Day"}}], {-1, "Day"}]},
Cases[data, {Alternatives @@ dtrange, _, _}]];