在第一列为周末日期的数据框中删除行

时间:2019-01-09 16:17:52

标签: python-3.x pandas datetime

我有一个Dataframe看起来像(例如)这样:

print(df)

           date     high      low   close
0    2008-01-01   15.540   15.540   15.54
1    2008-01-02   15.750   15.210   15.25
2    2008-01-03   15.450   14.950   15.02
3    2008-01-04   14.990   14.400   14.48
4    2008-01-05   14.890   14.400   14.78
5    2008-01-06   14.890   14.400   14.78
....

我想从Dataframe的日期栏中包含周末的行中删除行。

           date     high      low   close
0    2008-01-01   15.540   15.540   15.54
1    2008-01-02   15.750   15.210   15.25
2    2008-01-03   15.450   14.950   15.02
3    2008-01-04   14.990   14.400   14.48
4 <-- has been removed since 1/05/2008 is a Saturday   
5 <-- has been removed since 1/06/2008 is a Sunday
....

我尝试过:

df = df[~df.date.dt.weekday_name.isin(['Saturday','Sunday']).any(0)]

但它不起作用。

3 个答案:

答案 0 :(得分:1)

您可以这样创建一个排除列表(以防您想添加其他日子):

day_exclusion = ['Saturday', 'Sunday']

下面的代码将date列转换为datetime dtype,只有在我使用pd.read_clipboard()重新创建您的数据框的情况下才有必要(如果dtype已经是datatime,则可以删除pd.to_datetime部分)。然后,它会返回一个数据框,其中包含全天不在您的排除列表中的数据。

df[~(pd.to_datetime(df['date']).dt.weekday_name.isin(day_exclusion))]

结果:

enter image description here

答案 1 :(得分:0)

“更轻松”的方法将使用dt.weekday(星期一0,星期一6)

df = df[df.date.dt.weekday < 5]

或:

df.query('date.dt.weekday < 5', inplace=True)

完整示例:

import pandas as pd

df = pd.DataFrame({
    'date': pd.date_range(start='2019-01-01', end='2019-01-07'),
    'name': [
        'Robert Baratheon',
        'Jon Snow',
        'Daenerys Targaryen',
        'Theon Greyjoy',
        'Tyrion Lannister',
        'Cersei Lannister',
        'Sansa Stark'
    ]
})

df = df[df.date.dt.weekday < 5]
print(df)

返回:

        date                name
0 2019-01-01    Robert Baratheon
1 2019-01-02            Jon Snow
2 2019-01-03  Daenerys Targaryen
3 2019-01-04       Theon Greyjoy
6 2019-01-07         Sansa Stark

答案 2 :(得分:0)

这段代码完美地工作。

它将从数据框中删除“星期六”和“星期日”记录

        # *********** Removing weekend data from dataframe. ***************
    df["weekday"] = pd.to_datetime(df.date).dt.dayofweek
    no_weekend_data = df.drop(df.loc[df["weekday"] > 4].index)