代码之家  ›  专栏  ›  技术社区  ›  buhtz

从时间戳列中提取年/月,并将其存储在两个新列中

  •  0
  • buhtz  · 技术社区  · 5 年前

    我有一个 DataFrame 这样地

                            DATE
    0 2021-06-15 14:22:02.424126
    1 2021-06-15 14:22:02.424126
    

    YEAR 和 MONTH .

    df['YEAR'] = df.DATE.apply(lambda x: x.year)
    df['MONTH'] = df.DATE.apply(lambda x: x.month)
    

    这给了我预期的结果

                        DATE  YEAR  MONTH
    0 2021-06-15 14:23:16.315543  2021      6
    1 2021-06-15 14:23:16.315543  2021      6 
    

    # what I wish
    df[['A', 'B']] = df.DATE.apply(lambda x: (x.year, x.month))
    

    但结果让我困惑。

                            DATE  YEAR  MONTH     A     B
    0 2021-06-15 14:23:16.315543  2021      6  2021  2021
    1 2021-06-15 14:23:16.315543  2021      6     6     6
    

    我无法添加 axis=1 到 apply() .

    这是我的全部代码

    import pandas as pd
    
    # That is the initial DataFrame
    df = pd.DataFrame(data = {'DATE': [pd.Timestamp.now(),
                                       pd.Timestamp.now()]})
    
    # works fine
    df['YEAR'] = df.DATE.apply(lambda x: x.year)
    df['MONTH'] = df.DATE.apply(lambda x: x.month)
    
    # what I wish
    df[['A', 'B']] = df.DATE.apply(lambda x: (x.year, x.month))
    
    print(df)
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    5 年前

    更快的是使用本机函数,这是矢量化的,而不是 apply .dt for应用函数for Series/ column :

    df['YEAR'] = df.DATE.dt.year
    df['MONTH'] = df.DATE.dt.month
    

    df[['A', 'B']] = df.DATE.apply(lambda x: (x.year, x.month)).tolist()
    

    # That is the initial DataFrame with 10k rows
    df = pd.DataFrame(data = {'DATE': [pd.Timestamp.now()] * 10000})
    
    
    In [168]: %%timeit
         ...: df['YEAR'] = df.DATE.apply(lambda x: x.year)
         ...: df['MONTH'] = df.DATE.apply(lambda x: x.month)
         ...: 
         ...: 
    70.4 ms ± 265 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    In [169]: %%timeit
         ...: df[['A', 'B']] = df.DATE.apply(lambda x: (x.year, x.month)).tolist()
         ...: 
         ...: 
    64.5 ms ± 7.28 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    In [170]: %%timeit
         ...: df['C'] = df.DATE.dt.year
         ...: df['D'] = df.DATE.dt.month
         ...: 
         ...: 
    2.34 ms ± 17.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)