首页 > 解决方案 > 在 Python Pandas 的 DataFrame 中使用日期进行数据操作?

问题描述

我有如下数据框:

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 的数据。

在此处输入图像描述

标签: pythonpandasdataframedate

解决方案


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

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))

推荐阅读