Установите миллисекунды в часы в пандах до 24 часов - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий DataFrame, который суммирует различные случаи, с которыми я сталкиваюсь в моем наборе данных:

import pandas as pd
import numpy as np

df = pd.DataFrame({'date': [20120302, 20141017, 20150215], 
                   'time': [764, 17002, 110000517]}, dtype=np.uint64)

Числа, которые я вижу в столбце df.time, похожи на единицы, которые складываются по мере дняпочти до 240000000 (например, одна из последних записей может быть 235959281).Как вы можете предположить, они составляют до 24 часов (один день).

Я хочу объединить оба столбца, образуя столбец date_time, имеющий формат datetime64[ns], чтобы я мог провести дальнейший анализ с помощью панд.

Проблемы:

Я могу присоединиться к ним (т.е. преобразовать их в str), но я не получаю точный формат даты и времени, который мне нужен.Когда я присоединяюсь к ним, я получаю следующие значения, например:

20120302764
2014101717002
20150215110000517

И я хотел бы получить:

2012-03-02 00:00:00.764

2014-10-17 00:00:17.002

2015-02-15 11:00:00.517

С моей стороны:

  • Попытка конвертации напрямую с pd.to_datetime() не удалась, даже с предоставлением формата '%Y-%m-%d %H:%M:%S.%f'.

  • Я могу присоединиться к объекту timedelta64[ns]с datetime64[ns], чтобы сформировать последний столбец.Однако единицы, конвертированные с помощью timedelta, не дают реального часа, минуты, секунды и миллисекунды.

Вопрос: ¿Как я могу получить часы,минуты, секунды и миллисекунды из этих «единичных» величин таким образом, что я могу затем присоединить их к столбцу даты, чтобы сформировать полное значение date_time?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018
import pandas as pd
import numpy as np

df = pd.DataFrame({'date': [20120302, 20141017, 20150215], 
                   'time': [764, 17002, 110000517]}, dtype=np.uint64)

df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

df['combined'] = df['date'] + pd.to_timedelta(df['time'], unit='ms')

print(df.head())

Проблема с вашей попыткой состоит в том, что format должен отражать формат существующих данных.Вы должны сказать pandas, как читать 20120302.Тогда это просто случай сказать Pandas единицы времени в to_timedelta и добавить его в ваш столбец даты и времени.

0 голосов
/ 29 ноября 2018

Я бы конвертировал все это в строку, если вы это делаете, используйте zfill(9) в столбце времени, чтобы они все имели 9 цифр с пропущенными нулями, объединяли все вместе (дату и время) и использовалиpd.to_datetime в соответствующем формате:

df['datetime'] = pd.to_datetime(df.date.astype(str) + df.time.astype(str).str.zfill(9),
                                format='%Y%m%d%H%M%S%f')

>>> df
       date       time                datetime
0  20120302        764 2012-03-02 00:00:00.764
1  20141017      17002 2014-10-17 00:00:17.002
2  20150215  110000517 2015-02-15 11:00:00.517
...