Получите последние n дней в месяце, учитывая список дат - PullRequest
1 голос
/ 05 ноября 2019

Как извлечь из списка дат последние n дней в месяце?

Итак, скажем, у меня есть следующий список дат:

dates:2000.01.01 + til 60

и n:2.

Ожидаемый результат, который я хочу получить:

2000.01.30 2000.01.31 2000.02.28 2000.02.29

1 Ответ

4 голосов
/ 05 ноября 2019

Вы хотите создать словарь месяцев для каждой даты, а затем сгруппировать его. Как только это будет сделано, вы можете использовать оператор #. Обновление: подсписок, возможно, является лучшим оператором, для обработки возможных дубликатов, это зависит от входящих данных

// 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
...