我是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行)中测试了这种新方法,效果很好。但是,对于实际的80万行文件来说,要花费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秒为间隔进行划分吗?
非常感谢您!
答案 0 :(得分: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]