首页 > 解决方案 > 在数据框中组织日期和假期

问题描述

场景:我有一个包含不同列的数据,另一个包含日期列表的单个数据框。

数据框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中对数据量进行操作基本上每次都会崩溃文件。

标签: pythonpandasdataframe

解决方案


所以你想基本上将dataframe2的列合并到dataframe1对吗?尝试使用合并:

newdf = pd.DataFrame.merge(dataframe1, dataframe2, left_on='iterationcount', 
right_on='iterationcount', how='inner', indicator=False) 

那应该给你一个新的框架。


推荐阅读