Pandas 数据框:省略周末和假期附近的日子

sta*_*010 5 python pandas

我有一个带有 DataTimeIndex 和其他一些列的 Pandas 数据框,类似于:

import pandas as pd
import numpy as np

range = pd.date_range('2017-12-01', '2018-01-05', freq='6H')
df = pd.DataFrame(index = range)

# Average speed in miles per hour
df['value'] = np.random.randint(low=0, high=60, size=len(df.index))

df.info()
# DatetimeIndex: 141 entries, 2017-12-01 00:00:00 to 2018-01-05 00:00:00
# Freq: 6H
# Data columns (total 1 columns):
# value    141 non-null int64
# dtypes: int64(1)
# memory usage: 2.2 KB

df.head(10)
#                      value
# 2017-12-01 00:00:00     15
# 2017-12-01 06:00:00     54
# 2017-12-01 12:00:00     19
# 2017-12-01 18:00:00     13
# 2017-12-02 00:00:00     35
# 2017-12-02 06:00:00     31
# 2017-12-02 12:00:00     58
# 2017-12-02 18:00:00      6
# 2017-12-03 00:00:00      8
# 2017-12-03 06:00:00     30
Run Code Online (Sandbox Code Playgroud)

如何选择或过滤以下条目:

  1. 仅限工作日(即周六或周日不是周末)

  2. 不在列表中日期的 N 天内(例如美国假期,如“12-25”或“01-01”)?

我希望是这样的:

df = exclude_Sat_and_Sun(df)

omit_days = ['12-25', '01-01']
N = 3 # days near the holidays
df = exclude_days_near_omit_days(N, omit_days)
Run Code Online (Sandbox Code Playgroud)

我正在考虑创建一个新列来划分月份和日期,然后将它们与上述 1 和 2 的标准进行比较。但是,我希望使用 DateTimeIndex 有更多 Pythonic 的东西。

谢谢你的帮助。

Bah*_*eta 6

第一部分可以使用 PandasDatetimeIndex.dayofweek属性轻松完成,它从星期一开始计算工作日为 0,以星期日结束为 6。

df[df.index.dayofweek < 5] 只会给你工作日。


对于第二部分,您可以使用该datetime模块。下面我只举一个日期的例子,即2017-12-25。您可以轻松地将其概括为日期列表,例如通过定义辅助函数。

from datetime import datetime, timedelta

N = 3

df[abs(df.index.date - datetime.strptime("2017-12-25", '%Y-%m-%d').date()) > timedelta(N)]
Run Code Online (Sandbox Code Playgroud)

这将给出N=3距离 2017-12-25多天的所有日期。即排除2017-12-22到2017-12-28这7天的间隔。


最后,&您可能知道,您可以使用运算符组合这两个条件。

df[
   (df.index.dayofweek < 5) 
   & 
   (abs(df.index.date - datetime.strptime("2017-12-25", '%Y-%m-%d').date()) > timedelta(N))
  ]
Run Code Online (Sandbox Code Playgroud)