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, AddWorkdays
y 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:
- Según su condición inicial, agregue 2 o 3 días
- 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),
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
.
0 Comentarios