对于给定的数据帧,如下所示:
id start_date end_date
0 1 2014/5/26 2014/5/27
1 2 2014/6/27 2014/6/28
2 3 2014/7/20 2014/7/21
3 4 2014/9/12 2014/9/13
4 5 2014/10/10 2014/10/11
5 6 2020/3/20 2020/4/21
6 7 2020/4/10 2020/4/11
7 8 2020/4/15 2020/4/16
8 9 2020/3/23 2020/3/24
9 10 2020/4/6 2020/4/7
我想过滤start_date
或end_date
在2020-02, 2020-03, 2020-04
范围内的行,感谢您分享除我之外的其他可选解决方案。
前瞻结果如下:
id start_date end_date
5 6 2020-03-20 2020-04-21
6 7 2020-04-10 2020-04-11
7 8 2020-04-15 2020-04-16
9 10 2020-04-06 2020-04-07
答案 0 :(得分:1)
我认为这里DataFrame.apply
对于按列处理比较好,DataFrame.applymap
对于按元素进行处理:
df[['start_date', 'end_date']] = (df[['start_date', 'end_date']]
.apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d')))
然后用于过滤的Series.dt.to_period
使用了几个月的时间:
df = (df[(df['start_date'].dt.to_period('m')== '2020-04') |
(df['end_date'].dt.to_period('m')== '2020-04')])
print (df)
id start_date end_date
5 6 2020-03-20 2020-04-21
6 7 2020-04-10 2020-04-11
7 8 2020-04-15 2020-04-16
9 10 2020-04-06 2020-04-07
np.logical_or.reduce
可以按列进行循环解决,如果有更多列,则解决方案更好:
c = ['start_date', 'end_date']
df[c] = df[c].apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d'))
df = df[np.logical_or.reduce([df[x].dt.to_period('m')== '2020-04' for x in c])]
print (df)
id start_date end_date
5 6 2020-03-20 2020-04-21
6 7 2020-04-10 2020-04-11
7 8 2020-04-15 2020-04-16
9 10 2020-04-06 2020-04-07
答案 1 :(得分:0)
以下解决方案有效:
df[['start_date', 'end_date']] = df[['start_date', 'end_date']].applymap(lambda x: pd.to_datetime(x, format = '%Y/%m/%d'))
df.loc[((df['start_date'].dt.year == 2020) & (df['start_date'].dt.month==4)) | ((df['end_date'].dt.year == 2020) & (df['end_date'].dt.month==4))]
出局:
id start_date end_date
5 6 2020-03-20 2020-04-21
6 7 2020-04-10 2020-04-11
7 8 2020-04-15 2020-04-16
9 10 2020-04-06 2020-04-07