如何提取日期列表中每月的最后n
天?
所以说我有以下日期列表:
dates:2000.01.01 + til 60
和n:2
。
我想要的预期结果是:
2000.01.30 2000.01.31 2000.02.28 2000.02.29
答案 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