【问题标题】:Python pandas .loc multiple conditions and modify part of datePython pandas .loc 多个条件并修改部分日期
【发布时间】:2016-07-25 04:18:25
【问题描述】:

我有一个 DataFrame(其中包括)两个日期列,格式如下:

cap['DateCollecte'] = pd.to_datetime(cap['Date de collecte']+' '+cap['Heure de collecte'],format='%d/%m/%Y %H:%M:%S',errors='coerce')
cap['DatePose'] = pd.to_datetime(cap['Date de pose']+' '+cap['Heure de pose'],format='%d/%m/%Y %H:%M:%S',errors='coerce')

我知道其中一些有错误:DatePose 的年份是 2010,DateCollecte 的年份是 2011。DatePose 的年份也应该是 2011。 我想做什么的想法或多或少:

cap.loc[(cap.DateCollecte.dt.year == 2011) & (cap.DatePose.dt.year == 2010), cap.DatePose.dt.year] = 2011

我认为棘手的部分是我只想更改日期的年份部分。有没有办法做到这一点?

在最坏的情况下,因为它只涉及具有不同日期的 3 行(但同一年的问题),我可以手动完成。

【问题讨论】:

    标签: python datetime pandas multiple-conditions


    【解决方案1】:

    您可以使用您的掩码并添加DateOffset,例如:

    In [43]:
    df=pd.DataFrame({'a':pd.date_range(dt.datetime(2011,1,1), dt.datetime(2012,1,1), freq='M'), 'b':pd.date_range(dt.datetime(2010,6,1), dt.datetime(2011,6,1), freq='M')})
    df
    
    Out[43]:
                a          b
    0  2011-01-31 2010-06-30
    1  2011-02-28 2010-07-31
    2  2011-03-31 2010-08-31
    3  2011-04-30 2010-09-30
    4  2011-05-31 2010-10-31
    5  2011-06-30 2010-11-30
    6  2011-07-31 2010-12-31
    7  2011-08-31 2011-01-31
    8  2011-09-30 2011-02-28
    9  2011-10-31 2011-03-31
    10 2011-11-30 2011-04-30
    11 2011-12-31 2011-05-31
    
    In [65]:
    df.loc[(df['a'].dt.year == 2011) & (df['b'].dt.year == 2010), 'b'] = df['b'] + pd.DateOffset(years=1)
    df
    
    Out[65]:
                a          b
    0  2011-01-31 2011-06-30
    1  2011-02-28 2011-07-31
    2  2011-03-31 2011-08-31
    3  2011-04-30 2011-09-30
    4  2011-05-31 2011-10-31
    5  2011-06-30 2011-11-30
    6  2011-07-31 2011-12-31
    7  2011-08-31 2011-01-31
    8  2011-09-30 2011-02-28
    9  2011-10-31 2011-03-31
    10 2011-11-30 2011-04-30
    11 2011-12-31 2011-05-31
    

    一般情况下,您可以使用apply 动态应用差异:

    In [69]:
    df['b'] = df.apply(lambda x: x['b'] + pd.DateOffset(years=x['a'].year-x['b'].year), axis=1)
    df
    
    Out[69]:
                a          b
    0  2011-01-31 2011-06-30
    1  2011-02-28 2011-07-31
    2  2011-03-31 2011-08-31
    3  2011-04-30 2011-09-30
    4  2011-05-31 2011-10-31
    5  2011-06-30 2011-11-30
    6  2011-07-31 2011-12-31
    7  2011-08-31 2011-01-31
    8  2011-09-30 2011-02-28
    9  2011-10-31 2011-03-31
    10 2011-11-30 2011-04-30
    11 2011-12-31 2011-05-31
    

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 2018-05-12
      • 2016-01-19
      • 2023-01-26
      相关资源
      最近更新 更多