python - 在数据框中组织日期和假期
问题描述
场景:我有一个包含不同列的数据,另一个包含日期列表的单个数据框。
数据框1示例:
iterationcount datecolumn list
iteration5 1
iteration5 2
iteration3 2
iteration3 2
iteration4 33
iteration3 4
iteration1 5
iteration2 3
iteration5 2
iteration4 22
数据框2示例:
iteration1 01.01.2018 26.01.2018 30.03.2018
iteration2 01.01.2018 30.03.2018 02.04.2018 25.12.2018 26.12.2018
iteration3
iteration4 01.01.2018 15.01.2018 19.02.2018
iteration5 01.01.2018 19.02.2018 30.03.2018 21.05.2018 02.07.2018 06.08.2018 03.09.2018 08.10.2018 12.11.2018
第二个数据框是每个迭代的假期列表。它将用于填充第一个数据框的第二列
约束:对于第一个数据帧的每次迭代,用户将选择月份和年份:然后脚本将找到该月的第一个日期。如果该日期在该迭代的 dataframe2 日期列表中,则根据程序日历选择下一个工作日期。
例如:用户选择 2018 年 1 月,代码返回 01/01/2018。对于第一次迭代,该日期是假期,因此选择下一个工作日,在本例中为 02/01/2018,然后将此日期输入到与该迭代对应的所有 dataframe1 中:
iterationcount datecolumn list
iteration5 1
iteration5 2
iteration3 2
iteration3 2
iteration4 33
iteration3 4
iteration1 02/01/2018 5
iteration2 3
iteration5 2
iteration4 22
然后移动到下一个迭代(一些迭代将具有相同的日历日期)。
代码:到目前为止我已经尝试了多种方法,但无法达到结果。我认为我得到的最接近的是:
import pandas as pd
import datetime
import os
from os import listdir
from os.path import isfile, join
import glob
## Get Adjustments
mypath3 = "//DGMS/Desktop/Uploader_v1.xlsm"
ApplyOnDates = pd.read_excel(open(mypath3, 'rb'), sheet_name='Holidays')
# Get content
mypath = "//DGMS/Desktop/Uploaded"
all_files = glob.glob(os.path.join(mypath, "*.xls*"))
contentdataframes = []
contentdataframes2 = []
for f in all_files:
df = pd.read_excel(f)
df['Name'] = os.path.basename(f).split('.')[0].split('_')[0]
df['ApplyOn']= ''
mask = df.columns.str.contains('Base|Last|Fixing|Cash')
c2 = df.columns[~mask].tolist()
df = df[c2]
contentdataframes.append(df)
finalfinal = pd.concat(contentdataframes2)
for row in finalfinal.Name.itertuple():
datedatedate = datetime.datetime(2018, 01, 1)
if (pd.np.where(ApplyOnDates.Index.str.contains(finalfinal(row)).isin(datedatedate) = True:
datetouse = datedatedate + datetime.timedelta(days=1)
else:
datetouse = datedatedate
finalfinal['ApplyOn'] = datetouse
问题:基本上,我在这里的主要问题是能够匹配两个数据框中的行并在假期数据框的列中搜索日期。有没有合适的方法来做到这一点?
Obs:我可以直接在vba中实现类似的结果,通过使用excel的功能(vlookup,match...),问题是在excel中对数据量进行操作基本上每次都会崩溃文件。
解决方案
所以你想基本上将dataframe2的列合并到dataframe1对吗?尝试使用合并:
newdf = pd.DataFrame.merge(dataframe1, dataframe2, left_on='iterationcount',
right_on='iterationcount', how='inner', indicator=False)
那应该给你一个新的框架。
推荐阅读
- keras - Keras 自定义生成器:检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到的数组形状为 (256, 1)
- node.js - 使用 Mocha 测试 Node.js 应用程序,包括依赖项中的 ES6 模块
- java - 如何在没有互联网连接的情况下将对象(带有图像和其他数据的 hashMap)上传到 Firebase 实时数据库和 Firebase 存储?
- python - 使用来自 df 的时间戳对 pandas 中的另一个 df 进行切片
- c# - wpf 更改 tabitem 标题方向
- google-chrome-extension - 为什么此规则不阻止所有请求?
- php - 无法确定类“App\Entity\XXXX”中属性“image”的访问类型。Symfony 4 - EasyAdmin 3.2 - VichUploader
- javascript - React - Material UI 表在每一行中包含一个下拉列表
- wildfly - Teiid-wildfly Odata4 服务器端验证
- omnet++ - 如何获取静脉中的 RSU 节点坐标?