Date 根据日期列表获取每月最后n天
如何提取日期列表中每个月的最后Date 根据日期列表获取每月最后n天,date,grouping,kdb,Date,Grouping,Kdb,如何提取日期列表中每个月的最后n天 假设我有以下日期列表: dates:2000.01.01 + til 60 和n:2 我想要的结果是: 2000.01.30 2000.01.31 2000.02.28 2000.02.29 您需要为每个日期建立一个月的字典,然后对它进行分组。完成后,您可以使用操作符。更新:sublist可能是一个更好的运算符,用于处理可能的重复项,这取决于传入的数据 // Build the dictionary/mapping q)dates!`month$dates
n
天
假设我有以下日期列表:
dates:2000.01.01 + til 60
和n:2
我想要的结果是:
2000.01.30 2000.01.31 2000.02.28 2000.02.29
您需要为每个日期建立一个月的字典,然后对它进行分组。完成后,您可以使用
操作符。更新:sublist可能是一个更好的运算符,用于处理可能的重复项,这取决于传入的数据
// 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
根据Terry的建议,编辑以利用子列表而不是#
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
您需要为每个日期建立一个月的字典,然后对它进行分组。完成后,您可以使用
操作符。更新:sublist可能是一个更好的运算符,用于处理可能的重复项,这取决于传入的数据
// 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
根据Terry的建议,编辑以利用子列表而不是#
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
美好的如果可以重复(例如,给定月份中只有一个日期),则在
#
上使用子列表
可能很有用。另外,我喜欢函数名!很好,假设数据完整性从来都不是一个好主意!很遗憾,这个问题在万圣节前没有被问到,我认为有趣的问题命名是所有程序员的秘密乐趣。如果可以重复(例如,给定月份中只有一个日期),则在#
上使用子列表
可能很有用。另外,我喜欢函数名!很好,假设数据完整性从来都不是一个好主意!很遗憾,这个问题在万圣节前没有被问到,我认为有趣的问题命名是所有程序员的秘密乐趣