代码之家  ›  专栏  ›  技术社区  ›  Espoir Murhabazi

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

  •  1
  • Espoir Murhabazi  · 技术社区  · 6 年前

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

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

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

    正确的格式应为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
    

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   SpghttCd    6 年前

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