熊猫数据框时移列

时间:2018-08-20 05:10:24

标签: python pandas

我得到了一个分布不均的数据集,每个条目都有一个time,这是一个Timestamp对象。现在,我想通过将每列移回一定的时间来创建新列(在平移时间之后选择最接近的条目)。

一个例子:

      a    b    c                time
0     0    1    2 2018-08-20 15:00:00
1     3    4    5 2018-08-20 15:00:03
2     6    7    8 2018-08-20 15:00:05
3     9   10   11 2018-08-20 15:00:12
4    12   13   14 2018-08-20 15:00:13
5    15   16   17 2018-08-20 15:00:14
6    18   19   20 2018-08-20 15:00:20
7    21   22   23 2018-08-20 15:00:25
8    24   25   26 2018-08-20 15:00:33
9    27   28   29 2018-08-20 15:00:34
10   30   31   32 2018-08-20 15:00:40

预期的输出(向后移10秒):

      a    b    c                time  shifted_a  shifted_b  shifted_c
0     0    1    2 2018-08-20 15:00:00          0          1          2
1     3    4    5 2018-08-20 15:00:03          0          1          2
2     6    7    8 2018-08-20 15:00:05          0          1          2
3     9   10   11 2018-08-20 15:00:12          3          4          5
4    12   13   14 2018-08-20 15:00:13          3          4          5
5    15   16   17 2018-08-20 15:00:14          6          7          8
6    18   19   20 2018-08-20 15:00:20          9         10         11
7    21   22   23 2018-08-20 15:00:25         18         19         20
8    24   25   26 2018-08-20 15:00:33         21         22         23
9    27   28   29 2018-08-20 15:00:34         21         22         23
10   30   31   32 2018-08-20 15:00:40         24         25         26

我的想法是使用bisect.bisect_left来记录最近时间的位置,然后将移位的数字一一添加。我想知道是否有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

首先创建DatetimeIndex,然后通过方法datetimebfill移至NaN来创建df = df.set_index('time') df = df.reindex(df.index-pd.Timedelta(10, unit='s'), method='bfill') print (df) a b c time 2018-08-20 14:59:50 0 1 2 2018-08-20 14:59:53 0 1 2 2018-08-20 14:59:55 0 1 2 2018-08-20 15:00:02 3 4 5 2018-08-20 15:00:03 3 4 5 2018-08-20 15:00:04 6 7 8 2018-08-20 15:00:10 9 10 11 2018-08-20 15:00:15 18 19 20 2018-08-20 15:00:23 21 22 23 2018-08-20 15:00:24 21 22 23 2018-08-20 15:00:30 24 25 26 ,以创建reindex

button = pygame.transform.scale(infobut, ((130, 80))