在数据框中组织日期和假期

时间:2018-07-10 12:27:09

标签: python pandas dataframe

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

数据框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:通过使用excel的功能(vlookup,match ...),我能够直接在vba中获得类似的结果,问题是每次使用excel进行数据处理基本上会使文件崩溃

1 个答案:

答案 0 :(得分:0)

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

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

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