Python: приведение целого числа к метке времени данных - PullRequest
0 голосов
/ 12 сентября 2018

Мне очень трудно преобразовать следующий список l:

l = [0, 1]

в метки времени, соответствующие индексам следующего кадра данных df:

                 dt  val
2017-11-13 00:00:00  8
2017-11-13 01:00:00  17

В идеале результат должен быть:

l = [2017-11-13 00:00:00, 2017-11-13 01:00:00]

, чтобы я мог идентифицировать эти два временных шага на графике более длинного временного ряда, который перекрывается df.

Каков наилучший способделая это?Моя попытка терпит неудачу, и я не могу понять правильный формат отметки времени:

index1 = pd.to_datetime(str(df.index[l[0]]), format='%Y-%m-%d %H:%M:%S')
index2 = pd.to_datetime(str(df.index[l[1]]), format='%Y-%m-%d %H:%M:%S')

Это выдает ошибку:

ValueError: time data '2017-11-13 00:00:00' does not match format '%Y-%m-%d %H:%M:%S' (match)

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Есть несколько способов, но вот один без явного цикла или указания формата:

L = [0, 1]

datetime = pd.to_datetime('2017-11-13') + pd.to_timedelta(L, unit='h')

Результат:

DatetimeIndex(['2017-11-13 00:00:00', '2017-11-13 01:00:00'], 
              type='datetime64[ns]', freq=None)

Ваше решение не будет работать, потому что str не работает векторизованным способом.

0 голосов
/ 12 сентября 2018

Я считаю, что нужно понять список с f строками:

d = pd.to_datetime([f'2017-11-13 {x}:00:00' for x in l], format='%Y-%m-%d %H')
print(d)

DatetimeIndex(['2017-11-13 00:00:00', '2017-11-13 01:00:00'], 
              dtype='datetime64[ns]', freq=None)

Производительность (зависит от реальных данных):

np.random.seed(2018)
l = np.random.randint(12, size=1000).tolist()

In [48]: %%timeit
    ...: d = pd.to_datetime([f'2017-11-13 {x}:00:00' for x in l], format='%Y-%m-%d %H')
647 µs ± 2.45 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [49]: %%timeit
    ...: d = pd.to_datetime('2017-11-13' + 
             pd.Index(l).astype(str).str.zfill(2), format='%Y-%m-%d%H')
    ...: 
4.43 ms ± 22 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
...