сохраняйте только последнюю отметку времени на определенном дневном питоне - PullRequest
0 голосов
/ 19 декабря 2018

Привет, извините за то, что вы новичок с питоном, просто нужно указать точку в правильном направлении.

Вот данные, с которыми я работаю:

 2018-12-14 14:36:00
 2018-12-15 02:00:00
 2018-12-15 04:48:00
 2018-12-16 06:12:00
 2018-12-16 11:28:00
 2018-12-16 23:52:00

Что мне нужно сделатьсохранить только последнюю запись на каждый день.Разумно ли взять значения, которые хранятся в массиве numpy, и добавить их в список.Это будет мой лучший вариант?Я спрашиваю, потому что я знаю, что не могу удалить значения из массива.Просто любопытно, будет ли это легче сделать из списка или массива numy?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Я заметил, что ваши времена заказаны.В этом случае вы можете просто преобразовать в dict, чтобы сохранить последнюю запись:

>>> times
['2018-12-14 14:36:00',
 '2018-12-15 02:00:00',
 '2018-12-15 04:48:00',
 '2018-12-16 06:12:00',
 '2018-12-16 11:28:00',
 '2018-12-16 23:52:00']
>>> print(*dict(s.split() for s in times).items(), sep='\n')
('2018-12-14', '14:36:00')
('2018-12-15', '04:48:00')
('2018-12-16', '23:52:00')

Если порядок не является надежным, выполните сортировку , а не - это уменьшит сложность времени O (n log n) для задачи O (n) .Вместо этого вы должны построить dict (ключи - даты, а значения - списки времени) и взять максимумы для значений dict.

0 голосов
/ 19 декабря 2018

Если ваши данные не отсортированы, вы также можете сохранить даты в collections.defaultdict(), а затем взять максимум datetime:

from collections import defaultdict
from datetime import datetime

data = [
    '2018-12-14 14:36:00',
    '2018-12-15 02:00:00',
    '2018-12-15 04:48:00',
    '2018-12-16 06:12:00',
    '2018-12-16 11:28:00',
    '2018-12-16 23:52:00'
]

d = defaultdict(list)
for item in data:
    date, _ = item.split()
    d[date].append(item)

print([max(v, key=lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S")) for _, v in d.items()])
# ['2018-12-14 14:36:00', '2018-12-15 04:48:00', '2018-12-16 23:52:00']

Выше указано, что datetime.datetime.strptime() используется для получения максимального времени и даты, как указано в параметре key.

Если ваши данные уже отсортированы, вы можете воспользоваться itertools.groupby():

from itertools import groupby

data = [
    '2018-12-14 14:36:00',
    '2018-12-15 02:00:00',
    '2018-12-15 04:48:00',
    '2018-12-16 06:12:00',
    '2018-12-16 11:28:00',
    '2018-12-16 23:52:00'
]

print([list(g)[-1] for _, g in groupby(data, key=lambda x: x.split()[0])])
# ['2018-12-14 14:36:00', '2018-12-15 04:48:00', '2018-12-16 23:52:00']
0 голосов
/ 19 декабря 2018

Если это вариант, вы можете использовать некоторые из средств в pandas dataframes.

Следующее делает два предположения:

  1. Ваши данные были отсортированы по отметкам времени;
  2. Вы добавили дополнительный столбец для группировки, в котором будет сбрасываться время из отметки времени, чтобы можно было группировать по дням.

    my_dataframe.groupby(['my_date_only_column']).my_timestamp_column.last()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...