Pandas Timedelta для добавления десятичных часов к существующей временной метке - PullRequest
1 голос
/ 03 апреля 2020

Цель:
Я хотел бы использовать Timedelta для добавления часов в десятичном формате к существующей временной метке. Мой текущий код вызывает у меня проблему - вероятно, потому, что я не знаю, как не создавать список (некоторое время боролся за то, как решать проблемы). Хех.

У меня есть фрейм данных с именем 'df', который выглядит примерно так:

+---------------------+----------+
|        Time         | AddHours |
+---------------------+----------+
| 2019-11-13 09:30:00 | 3.177481 |
| 2019-11-13 09:30:00 | 2.752435 |
| 2019-11-13 09:30:00 | 3.129910 |
| 2019-11-13 09:30:00 | 3.078170 |
| 2019-11-13 09:30:00 | 2.105979 |
| 2019-11-13 09:30:00 | 3.086892 |
+---------------------+----------+

Типы данных поля
Поскольку, вероятно, полезно знать тип данных для этого упражнения:
df.dtypes возвращает:

Time          datetime64[ns]
AddHours            float64 <-- The units are hours. Eg 3.1202 hours

Существующий / код проблемы
Теперь - часть, с которой у меня возникли проблемы.
В настоящее время у меня есть:

df['Time'] = df['Time'] + [pd.Timedelta(hours=ts) for ts in df['AddHours']]

Это возвращает ошибку, которую я не знаю, как преодолеть. Я предполагаю, что "для ts в df ['AddHours']" возвращает список, в который я просто хочу добавить df ['Time'] + df ['AddHours'] для каждой строки в кадре данных, и что Timedelta позволяет мне рассматривать AddHours как десятичные часы.

Есть какие-нибудь яркие идеи о том, где я ошибаюсь, и как это исправить?

Ошибка:

TypeError: unsupported operand type(s) for +: 'DatetimeIndex' and 'list'

1 Ответ

1 голос
/ 03 апреля 2020

Используйте to_timedelta для преобразования в Timedeltas с:

df['Time'] = df['Time'] + pd.to_timedelta(df['AddHours'], unit='H')
print (df)
                        Time  AddHours
0 2019-11-13 12:40:38.931600  3.177481
1 2019-11-13 12:15:08.766000  2.752435
2 2019-11-13 12:37:47.676000  3.129910
3 2019-11-13 12:34:41.412000  3.078170
4 2019-11-13 11:36:21.524400  2.105979
5 2019-11-13 12:35:12.811200  3.086892

Ваше решение возможно путем преобразования списка в Index, но я думаю, что медленно, если большое DataFrame:

df['Time'] = df['Time'] + pd.Index([pd.Timedelta(hours=ts) for ts in df['AddHours']])
...