python - 在 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 列:
- col1 = 距下一个特殊日期的周数
- col2 = las 特殊日期之后的周数
所以我需要如下结果:
col1 = 1 因为 25.01 之后的下一个特殊日期是 27.01 所以它是同一周
col2 = 2 因为 25.01 之前的最后一个特殊日期是 16.01 所以我是 2 周前
*请注意,我有更多的日期,因此代码需要处理更多的日期,而不仅仅是 2 个特殊日期或只有 1 个来自 df 的数据。
解决方案
您可以使用广播创建时间增量矩阵,然后计算新列的最小值
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))
推荐阅读
- node.js - 这个 graphql 模式有什么问题,服务器正在启动但 localhost 没有加载?
- r - 移动列,将其他数据保留在 R 中
- css - 避免自定义光标在到达窗口边界时消失
- mongodb - mongodb $addToSet _ 添加对象无法正常工作 _ mongoose
- firebase - 如何使用firestore在flutter中更改子值时修改StreamProvider?
- angular - 404 Not Found 用于在 nginx 上重定向主页
- python - Scikit-learn 的 DBSCAN 给了我记忆错误
- r - 使用 dplyr 对子组求和
- django - 过滤 DRF 中字段的多个值
- python - 如何从我自己的 fork 中导入 sympy(或带有 __init__.py 的另一个模块)?