始终过滤到数据框中的上个月

时间:2019-11-15 00:12:46

标签: python pandas dataframe

我有一个数据框,其中有一个名为“发现日期”的列

date found
11/3/2019 7:39
11/3/2019 7:46
11/3/2019 11:23
11/3/2019 7:39
11/3/2019 11:32
10/2/2019 4:33
10/3/2019 8:30
10/3/2019 8:02
09/3/2019 10:43
09/3/2019 10:33
08/3/2019 11:24

什么是过滤日期的最佳方法,以使结果数据框始终位于上个月, 例如,今天是11月中的某一天,则所需的已过滤数据帧仅适用于10月。 如果今天是十月(十月中的任何一天),则过滤后的数据帧将是只有九月数据的数据帧。

2 个答案:

答案 0 :(得分:1)

IIUC DateOffset

s1=pd.to_datetime(df['date found']).dt.strftime('%Y-%m')
s2=(pd.to_datetime('today')-pd.DateOffset(months=1)).strftime('%Y-%m')
df[s1==s2]
Out[249]: 
       date found
5  10/2/2019 4:33
6  10/3/2019 8:30
7  10/3/2019 8:02

答案 1 :(得分:1)

选择正确的答案是可以的,但是下面的示例说明与日期时间格式有关的解决方案要快大约30倍:

# create dataframe
df = \
pd.DataFrame(
    {
        'date found': ['11/3/2019 7:39', '11/3/2019 7:46', '11/3/2019 11:23', '11/3/2019 7:39', '11/3/2019 11:32', '10/2/2019 4:33', '10/3/2019 8:30', '10/3/2019 8:02', '09/3/2019 10:43', '09/3/2019 10:33', '08/3/2019 11:24']*100000,
        'values': [i for i in range(11)]*100000
    }
)

# impose datetime64 format on column 'date found'
df['date found'] = pd.to_datetime(df['date found'])

好的解决方案:

%timeit
s1=pd.to_datetime(df['date found']).dt.strftime('%Y-%m')
s2=(pd.to_datetime('today')-pd.DateOffset(months=1)).strftime('%Y-%m')
df[s1==s2]

10.4 s ± 416 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

更省时:

%%timeit
mask = \
(df['date found'].dt.year == (pd.to_datetime('today')-pd.DateOffset(months=1)).year) & \
(df['date found'].dt.month == (pd.to_datetime('today')-pd.DateOffset(months=1)).month)
df[mask]

294 ms ± 35.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)