Header Ads Widget

Ticker

6/recent/ticker-posts

excel: agregue x número de días hábiles a una fecha en una columna personalizada: utilidad de código

 Estoy tratando de agregar una columna personalizada en Power Query que agrega 3 días hábiles si se cumple una condición; de lo contrario, agregue 2 días hábiles.

Puedo hacer que agregue días condicionalmente sin problema, pero tengo problemas para agregar días laborables en su lugar. Sé que esto se hace fácilmente en Excel, =IF X = 1,WORKDAY([REFERENCE],3),WORKDAY([REFERENCE],2)pero ¿cómo puedo hacer lo mismo que una columna personalizada en el editor de consultas?

A continuación se muestra lo que tengo, que hace días, incluidos los fines de semana:

=if [REF]="1" then Date.AddDays([ETA],3) else Date.AddDays([ETA],2)

,

Escribí una función personalizada que resuelve este problema, a menos que también necesite tener en cuenta las vacaciones. Es un poco universal, funciona con 2 o 200 o 2000 días añadidos. Función igual =WORKDAY(date;days)en excel.

ACTUALIZACIÓN: Bibake Uppal sugirió que debería admitirse la resta. Resta añadida para negativo days.

Aquí está:

1 
2 
3 
4 
5 
6 
7 
8 
9
(startDate, days) =>
    let
        Sign = if days < 0 then -1 else 1, //add a multiplier to enable negative 'days' to be subtracted rather than added
        Step1 = List.Dates(Date.AddDays(startDate, Sign), Sign*days + Number.RoundUp(Sign*days/7*3+4,0), #duration(Sign,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day; This is a bit over-provisioning, but ensures the list is long enough.
        Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays
        Step3 = List.FirstN(Step2, Sign*days), //select required number of workdays
        Output = if days = 0 then startDate else List.Last(Step3)
    in
        Output

Puede guardarlo como una consulta, nombrarlo, decir, AddWorkdaysy usarlo así:

1 
2 
3
YourStepName = Table.AddColumn(yourTable, "CustomColumnName", 
                    each AddWorkdays([ETA], if [REF]="1" then 3 else 2) 
                   //note that [REF]="1" filters a text value, not number!

De lo contrario, puede insertar esta función en su código como

1 
2 
3 
4 
5 
6 
7 
8 
9
fnAddWorkdays = (startDate, days) =>
let
    Sign = if days < 0 then -1 else 1, //add a multiplier to enable negative 'days' to be subtracted rather than added
    Step1 = List.Dates(Date.AddDays(startDate, Sign), Sign*days +  Number.RoundUp(Sign*days/7*3+4,0), #duration(Sign,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day; This is a bit over-provisioning, but ensures the list is long enough.
    Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays
    Step3 = List.FirstN(Step2, Sign*days), //select required number of workdays
    Output = if days = 0 then startDate else List.Last(Step3)
in
    Output

,

Una solución es dividirlo en 2 componentes:

  1. Según su condición inicial, agregue 2 o 3 días
  2. Si esto termina un sábado o domingo, agregue 2 días adicionales para omitir el fin de semana

Ya ha implementado el Paso 1.

Ahora solo necesita implementar el Paso 2, que es agregar los 2 días adicionales si es necesario. Puede usar la función DayOfWeek para determinar dónde comenzó, para determinar si necesitará los 2 días adicionales:

Si agrega 3 días hábiles, deberá agregar 2 días adicionales si el día inicial es miércoles, jueves o viernes:

1
if Date.DayOfWeek([ETA], Day.Wednesday) <= 2 then {Add 2 more days}

Si agrega 2 días hábiles, deberá agregar 2 días adicionales si el día inicial es el jueves o el viernes:

1
if Date.DayOfWeek([ETA], Day.Thursday) <= 1 then {Add 2 more days}

Puede incorporarlos en su declaración inicial.

,

Ligera mejora en la respuesta de Eugene para permitir también la sustracción de días laborales.

1 
2 
3 
4 
5 
6 
7 
8 
9
= (startDate, days) =>
let
    Step1 = if days >= 0 then List.Dates(Date.AddDays(startDate, 1), days + Number.RoundUp(days/7*3+4,0), #duration(1,0,0,0)) 
            else List.Dates(Date.AddDays(startDate, -1), -days + Number.RoundUp(-days/7*3+4,0), #duration(-1,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day
    Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays
    Step3 = List.FirstN(Step2, Number.Abs(days)), //select required number of workdays
    Output = List.Last(Step3)
in
    Output

Simplemente ingrese un valor negativo para days.

Publicar un comentario

0 Comentarios