Создание пользовательских данных на основе метки времени Unix - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть запись данных с меткой времени эпохи UNIX в качестве ключа и некоторым значением (это может быть Boolean, int, float, перечислимая строка). Я пытаюсь настроить метод, который принимает время начала, время окончания и размер корзины (x минут, x часов или x дней), помещает значения в dict в массив одного из контейнеров между этими временами.

По сути, я пытаюсь преобразовать данные из реального мира, измеренные в определенное время, в данные, происходящие на временном шаге, начиная с времени = 0 и продолжая до времени = T, где длинашаг времени может быть установлен при вызове метода.

Я пытаюсь сделать что-то вроде:

def binTimeSeries(dict, startTime, endTime, timeStep):
 bins = []
 #floor begin time to a timeStep increment
 #ciel end time to a timeStep increment
for key in dict.keys():
 if key > floorStartTime and key < cielEndTime:
  timeDiff = (key - floorStartTime)
  binIndex = floor(timeDiff/timeStep)
  bins[binIndex].append(dict[key])

У меня возникли проблемы при определении, какой формат времени подходит длявыполнить преобразование из временной метки эпохи UNIX в, которая может обрабатывать операции floor, ciel и modulo с заданным интервалом timeStep, а затем узнать, как на самом деле выполнять эти операции. Я искал это, но меня путают с формализмами datetime, pandas, и которые могут быть более подходящими для этого.

1 Ответ

0 голосов
/ 08 ноября 2019

Может как то так? Вместо того, чтобы спрашивать размер ячейки (интервал каждой ячейки), я думаю, что имеет смысл спросить, сколько корзин вы хотите вместо этого. Таким образом, вы гарантируете, что каждый контейнер будет иметь одинаковый размер (охватывать тот же интервал).

В моем примере ниже я сгенерировал некоторые поддельные данные, которые я назвал data. Начальные и конечные метки времени я выбрал произвольно, а также количество бинов. Я вычисляю разницу между конечными и начальными временными метками, которые я называю duration - это дает общую продолжительность между двумя временными метками (я понимаю, что немного глупо пересчитывать это значение, видя, как я его жестко закодировалранее в определении end_time_stamp, но это просто для полноты). bin_interval (в секундах) может быть вычислено путем деления длительности на количество бинов.

В итоге я сделал все, используя простые старые метки времени UNIX / POSIX, без какого-либо преобразования. Однако я упомяну, что datetime.datetime имеет метод с именем fromtimestamp, который принимает метку времени POSIX и возвращает объект datetime, заполненный годом, месяцем, секундами и т. Д.

Кроме того, в моем примеревсе, что я добавляю в контейнеры, это ключи - просто для демонстрации - вам придется изменить его в соответствии с вашими потребностями.

def main():

    import time

    values = ["A", "B", "C", "D", "E", "F", "G"]

    data = {time.time() + (offset * 32): value for offset, value in enumerate(values)}

    start_time_stamp = time.time() + 60
    end_time_stamp = start_time_stamp + 75

    number_of_bins = 12

    assert end_time_stamp > start_time_stamp
    duration = end_time_stamp - start_time_stamp

    bin_interval = duration / number_of_bins

    bins = [[] for _ in range(number_of_bins)]

    for key, value in data.items():
        if not (start_time_stamp <= key <= end_time_stamp):
            continue
        for bin_index, current_bin in enumerate(bins):
            if start_time_stamp + (bin_index * bin_interval) <= key < start_time_stamp + ((bin_index + 1) * bin_interval):
                current_bin.append(key)
                break

    print("Original data:")
    for key, value in data.items():
        print(key, value)

    print(f"\nStart time stamp: {start_time_stamp}")
    print(f"End time stamp: {end_time_stamp}\n")

    print(f"Bin interval: {bin_interval}")
    print("Bins:")
    for current_bin in bins:
        print(current_bin)

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

Вывод:

Original data:
1573170895.1871762 A
1573170927.1871762 B
1573170959.1871762 C
1573170991.1871762 D
1573171023.1871762 E
1573171055.1871762 F
1573171087.1871762 G

Start time stamp: 1573170955.1871762
End time stamp: 1573171030.1871762

Bin interval: 6.25
Bins:
[1573170959.1871762]
[]
[]
[]
[]
[1573170991.1871762]
[]
[]
[]
[]
[1573171023.1871762]
[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...