Я немного новичок в Python и мне нужна помощь для оптимизации моего кода.Поэтому моя проблема заключается в следующем: я имею дело со многими файлами размером около 800 000 x 12.
Первый столбец имеет формат метки времени, разделенный на 5 секунд (поэтому у нас должно быть 12 строк в минуту).Что происходит, так это то, что у меня нет секунд, поэтому мне нужно написать код для этого.Вот так выглядят мои необработанные данные.
0 2018-02-27 10:57:00
1 2018-02-27 10:57:00
2 2018-02-27 10:57:00
3 2018-02-27 10:57:00
4 2018-02-27 10:58:00
5 2018-02-27 10:58:00
6 2018-02-27 10:58:00
7 2018-02-27 10:58:00
8 2018-02-27 10:58:00
9 2018-02-27 10:58:00
10 2018-02-27 10:58:00
11 2018-02-27 10:58:00
12 2018-02-27 10:58:00
13 2018-02-27 10:58:00
14 2018-02-27 10:58:00
15 2018-02-27 10:58:00
16 2018-02-27 10:59:00
17 2018-02-27 10:59:00
18 2018-02-27 10:59:00
Так что после некоторого чтения я обнаружил, что если у меня есть первый и последний момент времени, я мог бы создать словарь временного диапазона с функцией date_range, изатем подставьте мою колонку (см. код ниже).Это работает, и это быстро, но только если у меня нет пропущенных данных в интервале (а между прочим много пропущенных строк), так как количество строк, созданных функцией, будет отличаться от количества строк, которыеУ меня есть.
start = df.iloc[0,0]
startstr = start.strftime('%m/%d/%Y %H:%M:%S')
finish = df.iloc[-1,0]
finishstr = finish.strftime('%m/%d/%Y %H:%M:%S')
newdatetime = pd.date_range(startstr,finishstr, freq='5S')
df["Date_Timefixed"] = newdatetime
df = df.drop('Date_Time', axis=1)
Подумав, я пытался создать новый код, используя логику сравнения между строками, а затем с помощью итератора вычислить значение секунд.Я протестировал этот новый подход в небольшой части (30 строк) и отлично работает.Однако для создания 800 000 строк файл занимает более 30 минут.
i = 0
for row in range(len(df.index)):
if i > 12:
break
else:
if df.iloc[row,0] == df.iloc[row-1,0]:
df.iloc[row-1,0] = df.iloc[row-1,0].replace(second=5*i)
i += 1
else:
df.iloc[row-1,0] = df.iloc[row-1,0].replace(second=55)
i = 0
Итак, мой вопрос: существует ли более эффективный способ написания второго подхода?Или даже больше, не могли бы вы помочь мне более разумно решить эту проблему (переписать временные метки, которые следует разделить с интервалом в 5 секунд?
Большое спасибо!