【问题标题】:Fastest way to eliminate specific dates from pandas dataframe从熊猫数据框中消除特定日期的最快方法
【发布时间】:2016-09-15 10:09:27
【问题描述】:

我正在处理一个大型数据框,我正在努力寻找一种有效的方法来消除特定日期。请注意,我试图从特定日期中消除任何测量

Pandas 有这个很棒的功能,你可以在这里调用:

df.ix['2016-04-22'] 

并从那天拉出​​所有行。但是,如果我想从 '2016-04-22' 中删除所有行怎么办?

我想要这样的功能:

df.ix[~'2016-04-22']

(但这不起作用)

另外,如果我想删除日期列表怎么办?

目前,我有以下解决方案:

import numpy as np
import pandas as pd
from numpy import random

###Create a sample data frame

dates = [pd.Timestamp('2016-04-25 06:48:33'), pd.Timestamp('2016-04-27 15:33:23'), pd.Timestamp('2016-04-23 11:23:41'), pd.Timestamp('2016-04-28    12:08:20'), pd.Timestamp('2016-04-21 15:03:49'), pd.Timestamp('2016-04-23 08:13:42'), pd.Timestamp('2016-04-27 21:18:22'), pd.Timestamp('2016-04-27 18:08:23'), pd.Timestamp('2016-04-27 20:48:22'), pd.Timestamp('2016-04-23 14:08:41'), pd.Timestamp('2016-04-27 02:53:26'), pd.Timestamp('2016-04-25 21:48:31'), pd.Timestamp('2016-04-22 12:13:47'), pd.Timestamp('2016-04-27 01:58:26'), pd.Timestamp('2016-04-24 11:48:37'), pd.Timestamp('2016-04-22 08:38:46'), pd.Timestamp('2016-04-26 13:58:28'), pd.Timestamp('2016-04-24 15:23:36'), pd.Timestamp('2016-04-22 07:53:46'), pd.Timestamp('2016-04-27 23:13:22')]

values = random.normal(20, 20, 20)

df = pd.DataFrame(index=dates, data=values, columns ['values']).sort_index()

### This is the list of dates I want to remove

removelist = ['2016-04-22', '2016-04-24']

这个 for 循环基本上抓取我要删除的日期的索引,然后从主数据帧的索引中删除它,然后从数据帧中积极选择剩余的日期(即:好的日期)。

for r in removelist:
    elimlist = df.ix[r].index.tolist()
    ind = df.index.tolist()
    culind = [i for i in ind if i not in elimlist]
    df = df.ix[culind]

还有什么更好的吗?

我也尝试过按四舍五入的日期+1 天进行索引,所以是这样的:

df[~((df['Timestamp'] < r+pd.Timedelta("1 day")) & (df['Timestamp'] > r))]

但这变得非常麻烦,并且(在一天结束时)当我需要消除 n 个特定日期时,我仍然会使用 for 循环。

一定有更好的方法!正确的?可能是?

【问题讨论】:

    标签: python datetime pandas indexing data-science


    【解决方案1】:

    您可以使用列表推导式创建布尔掩码。

    >>> df[[d.date() not in pd.to_datetime(removelist) for d in df.index]]
                            values
    2016-04-21 15:03:49  28.059520
    2016-04-23 08:13:42 -22.376577
    2016-04-23 11:23:41  40.350252
    2016-04-23 14:08:41  14.557856
    2016-04-25 06:48:33  -0.271976
    2016-04-25 21:48:31  20.156240
    2016-04-26 13:58:28  -3.225795
    2016-04-27 01:58:26  51.991293
    2016-04-27 02:53:26  -0.867753
    2016-04-27 15:33:23  31.585201
    2016-04-27 18:08:23  11.639641
    2016-04-27 20:48:22  42.968156
    2016-04-27 21:18:22  27.335995
    2016-04-27 23:13:22  13.120088
    2016-04-28 12:08:20  53.730511
    

    【讨论】:

    • 不错的选择!谢谢亚历山大!
    【解决方案2】:

    与@Alexander 的想法相同,但使用DatetimeIndexnumpy.in1d 的属性:

    mask = ~np.in1d(df.index.date, pd.to_datetime(removelist).date)
    df = df.loc[mask, :]
    

    时间安排:

    %timeit df.loc[~np.in1d(df.index.date, pd.to_datetime(removelist).date), :]
    1000 loops, best of 3: 1.42 ms per loop
    
    %timeit df[[d.date() not in pd.to_datetime(removelist) for d in df.index]]
    100 loops, best of 3: 3.25 ms per loop
    

    【讨论】:

    • 太棒了!完美运行!非常感谢您的回复!
    猜你喜欢
    • 2020-01-07
    • 2013-10-23
    • 1970-01-01
    • 2021-05-23
    • 2018-01-18
    • 2021-03-19
    • 2014-06-04
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多