繁体   English   中英

如果开始日期优于结束日期,熊猫会更改日期格式

[英]pandas change date format if start date is superior to end 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  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

基本上我想要的是检查每一行,如果 start_date 优于 end_date,则更改 end_date 或开始日期的格式,直到 end_date 优于开始日期。

例如:对于第一行:我需要将结束日期更改为 2018-06-04,但是对于第二行,它的开始日期需要更改为 2018-01-08

有任何想法吗?

好的,我不确定这是否有帮助,但让我们看看......

我想首先声明,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

作为索引器,用于更改开始侧可能与结束侧部分分开的部分,即日值不大于 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM