我有一个数据框,其中有一个名为“发现日期”的列
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月。 如果今天是十月(十月中的任何一天),则过滤后的数据帧将是只有九月数据的数据帧。
答案 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)