У меня сложный формат даты с данными временных рядов. В моем фрейме данных из более чем ста тысяч строк у меня есть столбец datetime со значением даты, но формат %M:%S.%f.
Пример:
datetime
0 59:57.7
1 00:09.7
2 00:21.8
Что я хочу на выходе, так это преобразовать этот формат в %m/%d/%Y %H:%M:%S.%f с 01/01/2023 00:59:57.7 в качестве первой даты, а затем увеличить часы и день . Это данные временного ряда за несколько дней.
Результат:
datetime ProcessTime
59:57.7 01/01/2023 00:59:57.7
00:09.7 01/01/2023 01:00:09.7
00:21.8 01/01/2023 01:00:21.8
Я сделал этот код, чтобы изменить первую дату, чтобы попытаться получить ссылку и изменить другие.
import pandas as pd
from datetime import datetime
# Example dataframe
df = pd.DataFrame({'datetime': ['59:57.7', '00:09.7', '00:21.8']})
first_time_str = df['datetime'][0]
first_time_obj = datetime.strptime(first_time_str, '%M:%S.%f')
formatted_first_time = first_time_obj.replace(year=2023, month=1, day=1).strftime('%m/%d/%Y %H:%M:%S.%f')
df['datetime'][0] = formatted_first_time
Спасибо за вашу помощь. С уважением
Точная логика неясна
Вы можете преобразовать в_timedelta (после добавления недостающих часов '00:'
), затем получить cumsum и добавить исходную дату:
df['ProcessTime'] = (pd.to_timedelta('00:'+df['datetime']).cumsum()
.add(pd.Timestamp('2023-01-01 00:59:57.7'))
.dt.strftime('%m/%d/%Y %H:%M:%S.%f')
)
Выход:
datetime ProcessTime
0 59:57.7 01/01/2023 01:59:55.400000
1 00:09.7 01/01/2023 02:00:05.100000
2 00:21.8 01/01/2023 02:00:26.900000
df['ProcessTime'] = (pd.to_timedelta('00:'+df['datetime'])
.add(pd.Timestamp('2023-01-01'))
.dt.strftime('%m/%d/%Y %H:%M:%S.%f')
)
Выход:
datetime ProcessTime
0 59:57.7 01/01/2023 00:59:57.700000
1 00:09.7 01/01/2023 01:00:07.400000
2 00:21.8 01/01/2023 01:00:29.200000
t = pd.to_timedelta('00:'+df['datetime'])
df['ProcessTime'] = (pd.to_timedelta(t.diff().lt('0').cumsum(), unit='h')
.add(t+pd.Timestamp('2023-01-01'))
.dt.strftime('%m/%d/%Y %H:%M:%S.%f')
)
Выход:
datetime ProcessTime
0 59:57.7 01/01/2023 00:59:57.700000
1 00:09.7 01/01/2023 01:00:09.700000
2 00:21.8 01/01/2023 01:00:21.800000
@LaurentCesaro Мне очень любопытно узнать, какое из решений вы искали
Я использовал последний вариант «при условии, что вы хотите добавить 1 час, когда дельта времени станет меньше, чем предыдущая».
Непонятно, почему у вас есть +1h в выводе для строки 2/3.