我有一个带有 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)
如何选择或过滤以下条目:
仅限工作日(即周六或周日不是周末)
不在列表中日期的 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 的东西。
谢谢你的帮助。
第一部分可以使用 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)