Сгенерируйте метку времени по минутам и посчитайте сумму уникальных по каждой минуте - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть такой ndjson

{"start_time_last":"2019-02-24T00:07:25.875Z","start_time_first":"2019-02-24T00:07:25.875Z","device_id":"8160a3f87a977379f12f8826fd3c9c86ca3ca48a"}
{"start_time_last":"2019-02-24T00:48:56.100Z","start_time_first":"2019-02-24T00:40:24.464Z","device_id":"181606aabbf155217f59e302541638bfc7e07837"}
{"start_time_last":"2019-02-23T21:57:36.024Z","start_time_first":"2019-02-23T21:56:06.741Z","device_id":"1b62573cdfdab3902b72ec9e4797c422271f2efd"}

Как видите, каждая запись показывает активный период устройства, мой вопрос: хочу ли я создать ndjson, который имеет два поля.Одним из них является «отметка времени», которая проходит через 2019-02-23T00: 00, 2019-02-23T00: 01, ..., 2019-02-24T23: 59 (отметки времени в минутах) и подсчитывает уникальные значения уникального идентификатора device_id, который активенпо каждой отметке времени.

Например, для первой записи она начинается с 2019-02-24T00: 07: 25.875Z и заканчивается на 2019-02-24T00: 07: 25.875Z.Этот идентификатор устройства должен учитываться в метках времени:

2019-02-24T00:07

Как он появляется только в эту минуту.Для второй записи это должно быть посчитано в эти временные метки

2019-02-24T00:40,
2019-02-24T00:41,
2019-02-24T00:42,
2019-02-24T00:43,
2019-02-24T00:44,
2019-02-24T00:45,
2019-02-24T00:46,
2019-02-24T00:47,
2019-02-24T00:48

Как реализовать это, используя jq?Или какая-нибудь команда в Bash?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Насколько я понимаю, вы хотите (за каждую «минуту») подсчитывать количество активных устройств.Вот решение, которое предполагает, что входные данные задают непересекающиеся интервалы для каждого «идентификатора устройства»:

def seconds:
    # strips fractional seconds
    "\(.[:-5])Z" | fromdateiso8601;

def record($s; $e):
  reduce range($s | round; $e + 1) as $i (.; .[$i|todate] += 1);

reduce inputs as $in ({}; record( ($in | .start_time_first | seconds / 60); ($in | .start_time_last | seconds / 60)))

Вызов

Соответствующий вызов будет выглядеть следующим образом:

jq -n -f program.jq input.ndjson
0 голосов
/ 28 февраля 2019

Насколько я понимаю, вы берете эти объекты в качестве входных данных и генерируете серию объектов с timestamp в диапазоне дат start_time_* для каждой минуты и device_id.

Если ваша ОС и сборка поддерживают функции даты, вы можете использовать это для генерации вашего json.

def fromdateiso8601wd:
    # strips fractional seconds
    "\(.[:-5])Z" | fromdateiso8601;
[
    (.start_time_first | fromdateiso8601wd),
    (.start_time_last  | fromdateiso8601wd + 60)
] as [$s, $e] |
{
    timestamp: (range($s; $e; 60) | todateiso8601),
    device_id
}

Будет выдано:

{
  "timestamp": "2019-02-24T00:07:25Z",
  "device_id": "8160a3f87a977379f12f8826fd3c9c86ca3ca48a"
}
{
  "timestamp": "2019-02-24T00:40:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:41:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:42:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:43:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:44:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:45:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:46:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:47:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:48:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-24T00:49:24Z",
  "device_id": "181606aabbf155217f59e302541638bfc7e07837"
}
{
  "timestamp": "2019-02-23T21:56:06Z",
  "device_id": "1b62573cdfdab3902b72ec9e4797c422271f2efd"
}
{
  "timestamp": "2019-02-23T21:57:06Z",
  "device_id": "1b62573cdfdab3902b72ec9e4797c422271f2efd"
}
{
  "timestamp": "2019-02-23T21:58:06Z",
  "device_id": "1b62573cdfdab3902b72ec9e4797c422271f2efd"
}
...