【问题标题】:Data manipulation with date in DataFrame in Python Pandas?在 Python Pandas 的 DataFrame 中使用日期进行数据操作?
【发布时间】:2021-01-21 09:35:06
【问题描述】:

我有如下数据框:

df = pd.DataFrame({"data" : ["25.01.2020", and many more other dates...]})
df["data"] = pd.to_datetime(df["data"], format = "%d%m%Y")

我有一系列特殊日期,如下所示:

special_date = pd.Series(pd.to_datetime(["16.01.2020",
                                         "27.01.2020",
                                         and many more other dates...], dayfirst=True))

我需要在这个 DataFrame 中再计算 2 列:

  1. col1 = 距下一个特殊日期的周数
  2. col2 = las 特殊日期之后的周数

所以我需要如下结果:
col1 = 1 因为 25.01 之后的下一个特殊日期是 27.01 所以它是同一周
col2 = 2 因为 25.01 之前的最后一个特殊日期是 16.01,所以我是 2 周前

*请注意,我有更多的日期,因此代码需要处理更多的日期,而不是仅 2 个特殊日期或仅 1 个来自 df 的数据。

【问题讨论】:

    标签: python pandas dataframe date


    【解决方案1】:

    您可以使用广播创建时间增量矩阵,然后计算新列的最小值

    import numpy as np, pandas as pd
    df = pd.DataFrame({'data':  pd.to_datetime(["01.01.2020","25.01.2020","20.02.2020"], dayfirst=True)})
    s  = pd.Series(pd.to_datetime(["16.01.2020","27.01.2020","08.02.2020","19.02.2020"], dayfirst=True))
    
    delta = (s.to_numpy()[:,None] - df['data'].to_numpy()).astype('timedelta64[D]')  / np.timedelta64(1, 'D')
    n = np.min( delta, 0, where=delta> 0, initial=np.inf)
    p = np.min(-delta, 0, where=delta<=0, initial=np.inf)
    
    df['next'] = np.ceil(n/7) #consider np.floor
    df['prev'] = np.ceil(p/7) 
    

    除了使用 where 参数,您还可以手动执行这些步骤:

    n = delta.copy();  n[delta<=0] =  np.inf;  n = np.abs(np.min(n,0))
    p = delta.copy();  p[delta> 0] = -np.inf;  p = np.abs(np.min(-p,0))
    

    【讨论】:

    • Marc 我有这个错误,请复制粘贴你所有的代码:TypeError: amin() got an unexpected keyword argument 'where'
    • 马克你确定你的代码适合你吗?
    • 这很奇怪。你运行哪个 numpy 版本? numpy.amin 显然有自 numpy 版本 1.17.0 以来的论点。
    • 你的 numpy 版本是什么?
    • 我包含了一个没有where 参数的解决方案。这应该适合你。
    猜你喜欢
    • 2020-12-09
    • 2017-12-18
    • 2021-04-01
    • 2015-09-14
    • 2021-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多