我想首先声明,IMO试图修复读入时损坏的数据可能是危险的——可能是您的假设
怎样
然而:
具有
df.apply(lambda d: d.dt.day > 12)
Out:
start_date end_date
0 True False
7 False True
5 True False
3 False True
11 True False
12 True False
1 True False
8 True False
10 False True
我们可以在所有行中看到(我可以访问)
任何一个
开始
或
结束一天>12,这显然不适合作为一个月。也就是说,我们可以使用
mask = df.start_date.dt.day > 12
df[~mask].start_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
Out:
7 2018-01-08
3 2018-02-12
10 2018-07-09
Name: start_date, dtype: datetime64[ns]
和
df[mask].end_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
Out:
0 2018-06-04
5 2018-09-06
11 2018-09-05
12 2018-05-02
1 2018-08-03
8 2018-09-03
Name: end_date, dtype: datetime64[ns]
因此,如果适用:
df.start_date[~mask] = df[~mask].start_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
df.end_date[mask] = df[mask].end_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
这导致了
df
Out:
start_date end_date
0 2018-05-29 2018-06-04
7 2018-01-08 2018-03-30
5 2018-08-13 2018-09-06
3 2018-02-12 2018-02-15
11 2018-08-24 2018-09-05
12 2018-04-20 2018-05-02
1 2018-07-30 2018-08-03
8 2018-08-16 2018-09-03
10 2018-07-09 2018-07-20
其开始时间不再晚于结束时间:
df.start_date > df.end_date
Out:
0 False
7 False
5 False
3 False
11 False
12 False
1 False
8 False
10 False
dtype: bool