有没有更快的方法来重写时间戳数据?

问题描述 投票:0回答:1

我是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函数创建一个时间范围字典,然后替换我的列(参见下面的代码)。这是有效的,但速度很快,但只有当我没有在间隔中缺少数据时(并且有很多缺失的行btw),因为该函数创建的行数将不同于行数我有。

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秒间隔内划分?

非常感谢你!

python datetime optimization time timestamp
1个回答
0
投票

这是一种方法,我不是一个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]
© www.soinside.com 2019 - 2024. All rights reserved.