Python 如果开始日期优于结束日期,则更改日期格式
我正在清理一个数据,其中的值是日期 有时,我会找到一个给定事件的值,其中开始日期优于结束日期 在查看值之后,我注意到这是由于数据收集期间的日期时间格式错误造成的 有些排是yy-mm-dd,有些排是yy-dd-mm 正确的格式应为yy-mm-dd 这是数据Python 如果开始日期优于结束日期,则更改日期格式,python,pandas,date,Python,Pandas,Date,我正在清理一个数据,其中的值是日期 有时,我会找到一个给定事件的值,其中开始日期优于结束日期 在查看值之后,我注意到这是由于数据收集期间的日期时间格式错误造成的 有些排是yy-mm-dd,有些排是yy-dd-mm 正确的格式应为yy-mm-dd 这是数据 start_date end_date 0 2018-05-29 2018-04-06 7 2018-08-01 2018-03-30 5 2018-08-13 2018-06-09 3 2018-12-02
start_date end_date
0 2018-05-29 2018-04-06
7 2018-08-01 2018-03-30
5 2018-08-13 2018-06-09
3 2018-12-02 2018-02-15
11 2018-08-24 2018-05-09
12 2018-04-20 2018-02-05
1 2018-07-30 2018-03-08
8 2018-08-16 2018-03-09
10 2018-09-07 2018-07-20
基本上,我想检查每一行,如果开始日期优于结束日期,则更改结束日期或开始日期的格式,直到结束日期优于开始日期
例:对于第一行:
我需要将结束日期更改为2018-06-04,
但对于第二行,开始日期需要更改为2018-01-08
有什么想法吗?好的,我不确定这是否有用,但让我们看看 首先,我想声明,IMO试图修复读入时损坏的数据可能是危险的——也许您对数据损坏方式的假设并不完全正确。
然而: 与 我们可以看到,在所有行(我有权访问)中,开始或结束日期都大于12天,这显然不适合作为一个月。也就是说,我们可以使用
mask = df.start_date.dt.day > 12
作为一个索引器,用于更改起始侧可能与结束侧零件分开的零件,即日值不大于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.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
我的问题是:为什么?换句话说,您只是给出了一个条件,告诉您是否必须在一行中执行某些操作(开始>结束)。但我不明白为什么要这样做,即更改开始日期或结束日期。根据常识,事件在开始之前不应该结束,这就是我想要改变的原因。如果任何一种“交换”都能起作用,会发生什么?请考虑“<代码> 2018—05-03 < /代码>为开始,<代码> 2018—04-05 < /代码>为结束的情况。是否(在年月日)成为
2018-05-03
和2018-05-04
或2018-03-05
和2018-04-05
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