代码之家  ›  专栏  ›  技术社区  ›  The Great

如何避免在使用pandas提取数据时使用长整数?

  •  0
  • The Great  · 技术社区  · 4 年前

    post

    df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
                       'person_type':['A','A','B','C','D','B','A'],
                       'login_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM'],
                       'logout_date':[np.nan,'11/08/2013 11:21:00 AM',np.nan,'06/06/2014 05:00:00 AM',np.nan,'13/10/2012 12:00:00 AM',np.nan]})
    df.login_date = pd.to_datetime(df.login_date)
    df.logout_date = pd.to_datetime(df.logout_date)
    

    我想对“注销日期”列应用两个规则

    规则2-如果人员类型为A,注销日期为NaN,则在登录日期后加2天

    当我尝试下面的

    m1 = df['person_type'].isin(['B','C','D'])
    m2 = df['person_type'].isin(['A'])
    m3 = df['logout_datetime'].isna()
    
    df['logout_datetime'] = np.select([m1 & m3, m2 & m3],
                                  [df['login_datetime'], df['login_datetime'] + pd.DateOffset(days=2)],
                                   default=df['logout_datetime'])
    df['logout_date'] = np.select([m1 & m3, m2 & m3],
                                  [df['login_datetime'].dt.date, (df['login_datetime'] + pd.DateOffset(days=2)).dt.date],
                                   default=df['logout_datetime'])
    

    我想拿到 logout_date 直接使用列 np.select 如示例代码所示。

    目前我得到的输出如下,这是不正确的

    enter image description here

    你能帮我吗?我希望我的输出有正确的日期值

    1 回复  |  直到 4 年前
        1
  •  1
  •   jezrael    4 年前

    我认为这个问题没有解决 default 中的参数 np.select ( default=df['logout_datetime'] )把它改成 default=df['logout_datetime'].dt.date 对于从返回的相同类型 np.选择 :

    df['logout_date'] = np.select([m1 & m3, m2 & m3],
                                  [df['login_date'].dt.date, 
                                  (df['login_date'] + pd.DateOffset(days=2)).dt.date],
                                   default=df['logout_date'].dt.date)
    print (df)
       person_id person_type          login_date logout_date
    0        101           A 2013-05-07 09:27:00  2013-05-09
    1        101           A 2013-09-08 11:21:00  2013-11-08
    2        101           B 2014-06-06 08:00:00  2014-06-06
    3        101           C 2014-06-06 05:00:00  2014-06-06
    4        202           D 2011-12-11 10:00:00  2011-12-11
    5        202           B 2012-10-13 00:00:00  2012-10-13
    6        202           A 2012-12-13 11:45:00  2012-12-15
    

    然后是日期时间 Series.dt.normalize 删除次数(设置为 00:00:00 datetime s、 所以工作得很好:

    df['logout_date'] = np.select([m1 & m3, m2 & m3],
                                  [df['login_date'].dt.normalize(), 
                                   (df['login_date'] + pd.DateOffset(days=2)).dt.normalize()],
                                   default=df['logout_date'])
    print (df)
       person_id person_type          login_date         logout_date
    0        101           A 2013-05-07 09:27:00 2013-05-09 00:00:00
    1        101           A 2013-09-08 11:21:00 2013-11-08 11:21:00
    2        101           B 2014-06-06 08:00:00 2014-06-06 00:00:00
    3        101           C 2014-06-06 05:00:00 2014-06-06 05:00:00
    4        202           D 2011-12-11 10:00:00 2011-12-11 00:00:00
    5        202           B 2012-10-13 00:00:00 2012-10-13 00:00:00
    6        202           A 2012-12-13 11:45:00 2012-12-15 00:00:00
    

    df['logout_date'] = np.select([m1 & m3, m2 & m3],
                                  [df['login_date'], 
                                   (df['login_date'] + pd.DateOffset(days=2))],
                                   default=df['logout_date'])
    print (df)
       person_id person_type          login_date         logout_date
    0        101           A 2013-05-07 09:27:00 2013-05-09 09:27:00
    1        101           A 2013-09-08 11:21:00 2013-11-08 11:21:00
    2        101           B 2014-06-06 08:00:00 2014-06-06 08:00:00
    3        101           C 2014-06-06 05:00:00 2014-06-06 05:00:00
    4        202           D 2011-12-11 10:00:00 2011-12-11 10:00:00
    5        202           B 2012-10-13 00:00:00 2012-10-13 00:00:00
    6        202           A 2012-12-13 11:45:00 2012-12-15 11:45:00