Есть ли более быстрый способ переписать данные с отметкой времени? - PullRequest
0 голосов
/ 11 февраля 2019

Я немного новичок в 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 секунд?

Большое спасибо!

1 Ответ

0 голосов
/ 11 февраля 2019

Вот один из способов сделать это, я не pandas эксперт, поэтому у других может быть лучший способ.

Сначала давайте избавимся от всех отметок времени, где это не заканчивается 00так как мы хотим создать наши собственные диапазоны.

grouped = df[df.ts.str.endswith(':00')].groupby('ts')

pd.concat([grouped.ts.apply(lambda group: pd.DataFrame(
    pd.date_range(start=group.min(), periods=12,freq='5S')))]).melt().value

0    2018-02-27 10:57:00
1    2018-02-27 10:57:05
2    2018-02-27 10:57:10
3    2018-02-27 10:57:15
4    2018-02-27 10:57:20
5    2018-02-27 10:57:25
6    2018-02-27 10:57:30
7    2018-02-27 10:57:35
8    2018-02-27 10:57:40
9    2018-02-27 10:57:45
10   2018-02-27 10:57:50
11   2018-02-27 10:57:55
12   2018-02-27 10:58:00
13   2018-02-27 10:58:05
14   2018-02-27 10:58:10
15   2018-02-27 10:58:15
16   2018-02-27 10:58:20
17   2018-02-27 10:58:25
18   2018-02-27 10:58:30
19   2018-02-27 10:58:35
20   2018-02-27 10:58:40
21   2018-02-27 10:58:45
22   2018-02-27 10:58:50
23   2018-02-27 10:58:55
24   2018-02-27 10:59:00
25   2018-02-27 10:59:05
26   2018-02-27 10:59:10
27   2018-02-27 10:59:15
28   2018-02-27 10:59:20
29   2018-02-27 10:59:25
30   2018-02-27 10:59:30
31   2018-02-27 10:59:35
32   2018-02-27 10:59:40
33   2018-02-27 10:59:45
34   2018-02-27 10:59:50
35   2018-02-27 10:59:55
Name: value, dtype: datetime64[ns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...