给出日期列表,每月获取最后n天

时间:2019-11-05 09:20:49

标签: date grouping kdb

如何提取日期列表中每月的最后n天?

所以说我有以下日期列表:

dates:2000.01.01 + til 60

n:2

我想要的预期结果是:

2000.01.30 2000.01.31 2000.02.28 2000.02.29

1 个答案:

答案 0 :(得分:4)

您要为每个日期构建一个月的字典,然后将其分组。完成后,您可以使用#运算符。更新:子列表可能是更好的运算符,可以处理可能的重复项,这取决于传入的数据

// Build the dictionary/mapping
q)dates!`month$dates
2000.01.01| 2000.01
2000.01.02| 2000.01
2000.01.03| 2000.01
2000.01.04| 2000.01

// Group the results
q)group dates!`month$dates
2000.01| 2000.01.01 2000.01.02 2000.01.03 2000.01.04 2000.01.05 2000.01.06 20..
2000.02| 2000.02.01 2000.02.02 2000.02.03 2000.02.04 2000.02.05 2000.02.06 20..

// Act on each month
q)-2#/:group dates!`month$dates
2000.01| 2000.01.30 2000.01.31
2000.02| 2000.02.28 2000.02.29

// Raze the results
q)raze value -2#/:group dates!`month$dates
2000.01.30 2000.01.31 2000.02.28 2000.02.29

因此,总而言之,您可以通过投射日期,然后将它们分组来建立日期到它们各自月份的映射。完成后,您可以提取结果。您需要先对日期进行排序,然后再对其进行操作。

我们可以将所有这些都放到一个很好的函数中,它的名字叫lastDays

q)lastDays:{[dts;n] raze value (neg n)#/:group dts!`month$dts}
q)lastDays[dates;2]
2000.01.30 2000.01.31 2000.02.28 2000.02.29

根据Terrys的建议进行了编辑,以利用子列表而不是#

q)lastDays:{[dts;n] raze value sublist/:[neg n;]group dts!`month$dts}
q)lastDays[dates;2]
2000.01.30 2000.01.31 2000.02.28 2000.02.29