【问题标题】:Create new dataframe column with isoweekday from datetime使用日期时间的 isoweekday 创建新的数据框列
【发布时间】:2021-07-28 23:37:22
【问题描述】:

我有这个数据框,我想为发生碰撞的星期几创建一个新列。

    collision_date
0   2020-03-14
1   2020-07-26
2   2009-02-03
3   2009-02-28
4   2009-02-09

我已经尝试过这种变体,但没有任何效果。

 df["day of the week"] = df["collision_date"].isoweekday()

 df["day of the week"] = df["collision_date"].apply(isoweekday)

【问题讨论】:

    标签: pandas dataframe apply


    【解决方案1】:

    假设collision_date 是日期时间,我们可以使用dt.weekday(+1 匹配 isoweekday,返回 1-7 而不是 0-6):

    # Convert If needed
    df['collision_date'] = pd.to_datetime(df['collision_date'])
    # Turn into Number
    df['day of week'] = df['collision_date'].dt.weekday + 1
    

    apply 的较慢选项是每个日期调用 isoweekday

    from datetime import date
    
    
    # Convert If needed
    df['collision_date'] = pd.to_datetime(df['collision_date'])
    # Call isoweekday per date
    df['day of week'] = df['collision_date'].apply(date.isoweekday)
    

    df:

      collision_date  day of week
    0     2020-03-14            6
    1     2020-07-26            7
    2     2009-02-03            2
    3     2009-02-28            6
    4     2009-02-09            1
    

    通过timeit的计时信息:

    1000 行的样本数据:

    df = pd.DataFrame({
        'collision_date': pd.date_range(start='now', periods=1000, freq='D')
    })
    

    dt.weekday:

    %timeit df['collision_date'].dt.weekday + 1
    261 µs ± 1.91 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    apply:

    %timeit df['collision_date'].apply(date.isoweekday)
    2.53 ms ± 90.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

    • 非常感谢。前者的运行速度比 apply 快得多,所以我将使用它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2021-08-06
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多