Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果开始日期优于结束日期,则更改日期格式_Python_Pandas_Date - Fatal编程技术网

Python 如果开始日期优于结束日期,则更改日期格式

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

我正在清理一个数据,其中的值是日期

有时,我会找到一个给定事件的值,其中开始日期优于结束日期

在查看值之后,我注意到这是由于数据收集期间的日期时间格式错误造成的

有些排是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  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