Power BI is turning 10! Tune in for a special live episode on July 24 with behind-the-scenes stories, product evolution highlights, and a sneak peek at what’s in store for the future.
Save the dateEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
Hi all,
I am working on clinical data where I need to calulate sessions for patients by calculating date difference. I can do the same in python but the same script when used in power bi's power query it gives error as below
DataSource.Error: ADO.NET: Python script error.
<pi>TypeError: unsupported operand type(s) for -: 'str' and 'str'
</pi>
Details:
DataSourceKind=Python
DataSourcePath=Python
Message=Python script error.
<pi>TypeError: unsupported operand type(s) for -: 'str' and 'str'
</pi>
ErrorCode=-2147467259
ExceptionType=Microsoft.PowerBI.Scripting
Original data is as below:-
Expected output is as below:-
The python script used by me is
# 'dataset' holds the input data for this script
import pandas as pd
import numpy as np
import datetime
dataset['Days_btw'] = dataset.groupby('PatientID')['SessionDate'].diff() / np.timedelta64(1, 'D')
Any help or suggestions are appreciated.
Thank You.
Solved! Go to Solution.
Hi @Anonymous ,
You can do this using two different approaches Power Query or DAX.
Power Query
try if [PatientID] = #"Added Index"{[Index]-1}[PatientID] then [SessionDate] - #"Added Index"{[Index]-1}[SessionDate] else 0 otherwise 0
Result and complete code below:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bc7bCcAwDEPRXfwdiKXmOUvI/mskpaW0Rb8HG90xjCVZMNToOdIJm+HBprALpCuEwqQwKywKVSd/nQ1n5x7CRvQ3FoFOgTwUNvWeL/ysV3XYdRH8xrkA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [PatientID = _t, SessionDate = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"SessionDate", type date}, {"PatientID", Int64.Type}}),
#"Sorted Rows" = Table.Sort(#"Changed Type",{{"PatientID", Order.Ascending}, {"SessionDate", Order.Ascending}}),
#"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "Days_btw", each try if [PatientID] = #"Added Index"{[Index]-1}[PatientID] then [SessionDate] - #"Added Index"{[Index]-1}[SessionDate] else 0 otherwise 0),
#"Changed Type1" = Table.TransformColumnTypes(#"Added Custom",{{"Days_btw", Int64.Type}})
in
#"Changed Type1"
DAX
Days_btw_dax =
COALESCE (
DATEDIFF (
CALCULATE (
MAX ( 'Table (3)'[SessionDate] ),
FILTER (
ALL ( 'Table (3)'[PatientID],'Table (3)'[SessionDate] ),
'Table (3)'[PatientID] = EARLIER ( 'Table (3)'[PatientID] )
&& 'Table (3)'[SessionDate] < EARLIER ( 'Table (3)'[SessionDate] )
)
),
'Table (3)'[SessionDate],
DAY
),
0
)
Regards
Miguel Félix
Proud to be a Super User!
Check out my blog: Power BI em PortuguêsHi @Anonymous ,
You can do this using two different approaches Power Query or DAX.
Power Query
try if [PatientID] = #"Added Index"{[Index]-1}[PatientID] then [SessionDate] - #"Added Index"{[Index]-1}[SessionDate] else 0 otherwise 0
Result and complete code below:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bc7bCcAwDEPRXfwdiKXmOUvI/mskpaW0Rb8HG90xjCVZMNToOdIJm+HBprALpCuEwqQwKywKVSd/nQ1n5x7CRvQ3FoFOgTwUNvWeL/ysV3XYdRH8xrkA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [PatientID = _t, SessionDate = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"SessionDate", type date}, {"PatientID", Int64.Type}}),
#"Sorted Rows" = Table.Sort(#"Changed Type",{{"PatientID", Order.Ascending}, {"SessionDate", Order.Ascending}}),
#"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "Days_btw", each try if [PatientID] = #"Added Index"{[Index]-1}[PatientID] then [SessionDate] - #"Added Index"{[Index]-1}[SessionDate] else 0 otherwise 0),
#"Changed Type1" = Table.TransformColumnTypes(#"Added Custom",{{"Days_btw", Int64.Type}})
in
#"Changed Type1"
DAX
Days_btw_dax =
COALESCE (
DATEDIFF (
CALCULATE (
MAX ( 'Table (3)'[SessionDate] ),
FILTER (
ALL ( 'Table (3)'[PatientID],'Table (3)'[SessionDate] ),
'Table (3)'[PatientID] = EARLIER ( 'Table (3)'[PatientID] )
&& 'Table (3)'[SessionDate] < EARLIER ( 'Table (3)'[SessionDate] )
)
),
'Table (3)'[SessionDate],
DAY
),
0
)
Regards
Miguel Félix
Proud to be a Super User!
Check out my blog: Power BI em PortuguêsUser | Count |
---|---|
75 | |
74 | |
44 | |
31 | |
27 |
User | Count |
---|---|
99 | |
89 | |
52 | |
48 | |
46 |