我有一个包含重复时间戳的文件,每个时间戳最多两个,实际上它们不重复,只是第二个时间戳需要添加一个毫秒时间戳。 例如,我在文件中有这些,
....
2011/1/4 9:14:00
2011/1/4 9:15:00
2011/1/4 9:15:01
2011/1/4 9:15:01
2011/1/4 9:15:02
2011/1/4 9:15:02
2011/1/4 9:15:03
2011/1/4 9:15:03
2011/1/4 9:15:04
....
我想将它们改成
2011/1/4 9:14:00
2011/1/4 9:15:00
2011/1/4 9:15:01
2011/1/4 9:15:01.500
2011/1/4 9:15:02
2011/1/4 9:15:02.500
2011/1/4 9:15:03
2011/1/4 9:15:03.500
2011/1/4 9:15:04
....
执行此类任务的最有效方法是什么?
答案 0 :(得分:1)
所以这个算法应该运行得很好......我只是花了很多时间使用numpy的datetime数据类型。
In [154]: df
Out[154]:
0
0 2011/1/4 9:14:00
1 2011/1/4 9:15:00
2 2011/1/4 9:15:01
3 2011/1/4 9:15:01
4 2011/1/4 9:15:02
5 2011/1/4 9:15:02
6 2011/1/4 9:15:03
7 2011/1/4 9:15:03
8 2011/1/4 9:15:04
In [155]: ((dt.diff() == 0) * .005)
Out[155]:
0 0.000
1 0.000
2 0.000
3 0.005
4 0.000
5 0.005
6 0.000
7 0.005
8 0.000
Name: 0, dtype: float64
并且想法是将这两者加在一起。当然,一个是datetime64
,另一个是float64
。无论出于何种原因,np.timedelta64
不能在阵列上运行?无论如何,如果你能解决那些有效的dtype问题。
答案 1 :(得分:1)
设置
In [69]: df = DataFrame(dict(time = x))
In [70]: df
Out[70]:
time
0 2013-01-01 09:01:00
1 2013-01-01 09:01:00
2 2013-01-01 09:01:01
3 2013-01-01 09:01:01
4 2013-01-01 09:01:02
5 2013-01-01 09:01:02
6 2013-01-01 09:01:03
7 2013-01-01 09:01:03
8 2013-01-01 09:01:04
9 2013-01-01 09:01:04
找出与上一行的时差与0秒
的位置In [71]: mask = (df.time-df.time.shift()) == np.timedelta64(0,'s')
In [72]: mask
Out[72]:
0 False
1 True
2 False
3 True
4 False
5 True
6 False
7 True
8 False
9 True
Name: time, dtype: bool
将这些位置设置为使用5毫秒的偏移量(在您的问题中,您使用了500但可能是任何东西)。这需要numpy> = 1.7。 (并非此语法将在0.13中更改以允许更直接的df.loc[mask,'time'] += pd.offsets.Milli(5)
In [73]: df.loc[mask,'time'] = df.time[mask].apply(lambda x: x+pd.offsets.Milli(5))
In [74]: df
Out[74]:
time
0 2013-01-01 09:01:00
1 2013-01-01 09:01:00.005000
2 2013-01-01 09:01:01
3 2013-01-01 09:01:01.005000
4 2013-01-01 09:01:02
5 2013-01-01 09:01:02.005000
6 2013-01-01 09:01:03
7 2013-01-01 09:01:03.005000
8 2013-01-01 09:01:04
9 2013-01-01 09:01:04.005000
答案 2 :(得分:0)
假设 - ,如您在示例中所示,它们是连续的:
lasttimestamp = None
for ts = readtimestamp(infile): # I will leave this to you
if ts == lasttimestamp:
ts += inc_by # and this
lasttimestamp = ts
writetimestamp(outfile, ts) # and this to