【问题标题】:Drop rows where timestamps are older than subsequent row删除时间戳早于后续行的行
【发布时间】:2019-12-08 12:04:33
【问题描述】:

我正在尝试删除时间戳早于或晚于后续行的行。我不确定我是否想多了,但我目前的尝试如下。

注意:我不想对时间戳进行排序,所以它是有序的。我想完全删除或删除它们。

下面的df只是一个例子。我需要此代码用于不同的输入数据集,其中 unordered 时间戳的数量不同。

df = pd.DataFrame({
    'Time' : ['1/1/1900 8:00:00','1/1/1900 9:49:00','1/1/1900 10:00:00','1/1/1900 12:33:00','1/1/1900 12:35:00','1/1/1900 12:24:00','1/1/1900 13:42:00','1/1/1900 13:45:00','1/1/1900 14:21:00','1/1/1900 14:36:00'],                 
    'Number' : [1,2,2,2,1,1,2,2,3,4],                      
    })

df['Time'] = df['Time'].astype('datetime64')

df['diff'] = df['Time'] - df['Time'].shift(-1)

df['diff'] = df['diff'].dt.total_seconds()

df['diff'].fillna(0, inplace=True) 

df['diff'] = df['diff'].astype(int)

df = df[df['diff'] < 1]

输出:

                 Time  Number  diff
0 1900-01-01 08:00:00       1 -6540
1 1900-01-01 09:49:00       2  -660
2 1900-01-01 10:00:00       2 -9180
3 1900-01-01 12:33:00       2  -120 *Rows below are 12:24:00
5 1900-01-01 12:24:00       1 -4680
6 1900-01-01 13:42:00       2  -180
7 1900-01-01 13:45:00       2 -2160
8 1900-01-01 14:21:00       3  -900
9 1900-01-01 14:36:00       4     0

预期的df:

                Time  Number  diff
0 1900-01-01 08:00:00       1 -6540
1 1900-01-01 09:49:00       2  -660
2 1900-01-01 10:00:00       2 -9180
5 1900-01-01 12:24:00       1 -4680
6 1900-01-01 13:42:00       2  -180
7 1900-01-01 13:45:00       2 -2160
8 1900-01-01 14:21:00       3  -900
9 1900-01-01 14:36:00       4     0

它选择了索引 4,但没有选择索引 3。我不知道我是否应该创建一个交互的脚本,直到没有正数或有更简单的方法。

【问题讨论】:

  • 为什么5 1900-01-01 12:24:00 1 -4680 在预期的输出中,你能简单解释一下吗?谢谢
  • 在后续行之前?所以它是有序的。
  • @anky_91 他说你应该删除带有“旧”时间戳的行,而不是基于“新”5 1900-01-01 12:24:00 1 -4680 不比任何后续行更旧。

标签: python pandas sorting datetime


【解决方案1】:

应该这样做:

def myfunc(t,l):
    try:
        return not (t > min(l))
    except:
        return True

df[df.apply(lambda x: myfunc(x.Time,df.Time.iloc[x.name+1:len(df)].to_list()),axis=1)]

【讨论】:

    【解决方案2】:

    IIUC

    s=df.Time.diff().dt.total_seconds()
    df[(~s.lt(0)|s.isnull())]
                     Time  Number              diff
    0 1900-01-01 08:00:00       1 -1 days +22:11:00
    1 1900-01-01 09:49:00       2 -1 days +23:49:00
    2 1900-01-01 10:00:00       2 -1 days +21:27:00
    3 1900-01-01 12:33:00       2 -1 days +23:58:00
    4 1900-01-01 12:35:00       1          00:11:00
    6 1900-01-01 13:42:00       2 -1 days +23:57:00
    7 1900-01-01 13:45:00       2 -1 days +23:24:00
    8 1900-01-01 14:21:00       3 -1 days +23:45:00
    9 1900-01-01 14:36:00       4               NaT
    

    【讨论】:

    • 感谢您提高效率,但我仍然遇到同样的问题?
    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 2017-05-27
    • 1970-01-01
    • 2018-03-11
    • 2017-04-27
    • 2020-06-14
    • 2011-09-12
    • 2018-10-27
    相关资源
    最近更新 更多