Ошибка даты и времени при объединении объектов даты и времени - PullRequest
0 голосов
/ 04 мая 2020

У меня проблема с Python, когда я хочу объединить два столбца данных в один объект DateTime. Столбец начальных дат представлен в строковом формате, а часы - целые числа (1, 2, 3, ...., 23, 24), а новый день начинается снова с 1 (не с 24). Я использую команду smartmeter_data['Datetime']=pd.to_datetime(smartmeter_data['Date']) + smartmeter_data['Time'].astype('timedelta64[h]'), чтобы добавить новый столбец с указанием даты и времени. Однако я получил очень странные результаты:

...
19  01/09/2019 2019-01-09 20:00:00
20  01/09/2019 2019-01-09 21:00:00
21  01/09/2019 2019-01-09 22:00:00
22  01/09/2019 2019-01-09 23:00:00
23  01/09/2019 2019-01-10 00:00:00
24  02/09/2019 2019-02-09 01:00:00
25  02/09/2019 2019-02-09 02:00:00
26  02/09/2019 2019-02-09 03:00:00
...

Там дата 01/09/2019 была изменена на объект DateTime 2019-01-10 00:00:00, что неверно и делает очень странный «скачок» на моем графике. Мой желаемый вывод:

...
19  01/09/2019 2019-01-09 20:00:00
20  01/09/2019 2019-01-09 21:00:00
21  01/09/2019 2019-01-09 22:00:00
22  01/09/2019 2019-01-09 23:00:00
23  01/09/2019 2019-02-09 00:00:00
24  02/09/2019 2019-02-09 01:00:00
25  02/09/2019 2019-02-09 02:00:00
26  02/09/2019 2019-02-09 03:00:00
...

Я пытался найти решение через Google, но безуспешно. Кто-нибудь знает, как решить проблему?

Я был бы очень благодарен, когда вы могли бы помочь, использование даты и времени - основа моей работы.

1 Ответ

0 голосов
/ 04 мая 2020

У дня есть 24 часа, поэтому, если вы добавите к дате временную дельту, равную 24 часам, дата изменится на следующий день. Однако, почему бы вам не вычесть 1, чтобы получить правильную временную дельту (0-23 вместо 1-24)? Например,

import pandas as pd

smartmeter_data = pd.DataFrame({'Date': ['01/09/2019', '01/09/2019', '01/09/2019',
                                         '01/09/2019', '01/09/2019', '02/09/2019',
                                         '02/09/2019', '02/09/2019'],
                                'Time': [20, 21, 22, 23, 24, 1, 2, 3]})

smartmeter_data['Datetime'] = (pd.to_datetime(smartmeter_data['Date'], format='%d/%m/%Y') +
                               (smartmeter_data['Time'] - 1).astype('timedelta64[h]'))

# smartmeter_data
#          Date  Time            Datetime
# 0  01/09/2019    20 2019-09-01 19:00:00
# 1  01/09/2019    21 2019-09-01 20:00:00
# 2  01/09/2019    22 2019-09-01 21:00:00
# 3  01/09/2019    23 2019-09-01 22:00:00
# 4  01/09/2019    24 2019-09-01 23:00:00
# 5  02/09/2019     1 2019-09-02 00:00:00
# 6  02/09/2019     2 2019-09-02 01:00:00
# 7  02/09/2019     3 2019-09-02 02:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...