【问题标题】:Drop rows in a dataframe where first column is a weekend date在第一列是周末日期的数据框中删除行
【发布时间】:2019-01-09 16:17:51
【问题描述】:

我有一个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)]

但它不起作用。

【问题讨论】:

  • 您不需要any(0),只需使用df[~df.date.dt.weekday_name.isin(['Saturday','Sunday'])]any(0) 折叠为单个布尔值(可能是 True),而您需要一个布尔值的向量/数组。
  • 试试这个:df = df[df.date.dt.weekday &lt; 5]
  • 呃,感谢 jpp 的工作原理。

标签: python-3.x pandas datetime


【解决方案1】:

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

day_exclusion = ['Saturday', 'Sunday']

下面的代码将日期列转换为日期时间 dtype,这仅在我使用 pd.read_clipboard() 重新创建您的数据框的情况下是必需的(如果您的 dtype 已经是数据时间,您可以删除 pd.to_datetime 部分)。然后它会返回一个数据框,其中所有日期都不在您的排除列表中。

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

结果:

【讨论】:

    【解决方案2】:

    “更简单”的方法是使用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
    

    【讨论】:

      【解决方案3】:

      这段代码完美运行。

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

              # *********** 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-20
        • 2021-11-20
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多