Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
3 years ago

DAX - calculating interpolation between datetime values

Hello All,

 

I would like to have blank values to be filled with interpolated values as per the dates and name column values.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("jVg7blwxDLxK4DoRxD+ZLgiQJilSBGkM3/8a4VvEi/UjtXqGXSzI0UokZzTy6+sLyJeJX3AifZrz65wvn1944o/vYDZ+/81PL2+fP2bBpSy8lEWXsvhSllzK0ktZdinLL2XFlSy4VHu4VHtoa080UJWnABRA2wbCAQAJICuAtiMEA12ExakA2ubkN0wyDjcpgLZPyGNOw/zjAmhbllsyJEefXgBt97JKk5hMIAqgbeRRVkyEkp4BeKmn2PY0S4MqSBRlH9i2F3WIehZTK+AJy3TDfpTBCCwmXADtxnMfkXOGzFIAy7kMC1CGAujnkgZD9rSm91OZ6aSiIF4A/VTSuE1AyW5H8rZ9ZeeogH4kZwJ4ekwqgHYk0YcTmBBaAbQjmQBDxThn9xqDMSxYaGqpTy83xwHQVKQeYKE8c5CEaFBpWa88SXOfIIqznLhXHrSBM/IIVA/d9xhGdszEpQL6NicfCdgI6hn6NuOQg44etay98iQgx4JTrwqgVx4cSXjI33KGXnmebGkpQgqU4ll21GvQkW8HdwALYHXF6I36/v8ItpGj4whJHE36F8CTu9E2GlSyVrsVOAqIXABPLIrt9CaLgIEUpgXwxK3YRmdSBbKyxkmkAlgNYCa7kdRmrAZQJPLn/XK1jdSUrP4GSUV1nDS93GTvQ/Hrz/ef355402UcN3HaxHkTl01cN3HbxH0Tj+dx2NQPNvWDU/2Uh0GOAFX/dqqk5pCn+VRHXJnJe6oPUASgxoKd6quRpsemp4isDOR7qkimMpNrNadWVgXPCWy+f1N/ONXfjmtmQop08dy4aQVuWoHnVszctPiUyhpsp7o6v3upbFDIjYMrz3dPjeGRyhVYzVXLtWru7rXC4wDAKOXy6GlXfdzDUkpAItUD9Qysnu1eVsv3AIajVv/rZcQNOK1p6Mqn3VNT4mhCesalSXugGAWpe6nKmayqYybHwr0ueh6WfCykhyOaxbSeiZu8MQdwtKUXu696PLaQj5OtXNgDxfLRl+tiqdWZuDbTDMrthbVyXg90A6ZsVbNXL6m5Zl52tVlnEq/M1TLeMrd6p2X8TAw43DBCWrGVSfq4VPVEy3i7leqDlvGWmNXwLOMtG6uzeRC5fMtHOFQHdm6wjZiRbKim6izSMtJ6sd//C1FtzGp/ZwqyH69lhODc39s/", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Datetime = _t, Name = _t, value = _t]),
    #"Added Suffix" = Table.TransformColumns(Source, {{"Datetime", each _ & ":00", type text}}),
    #"Changed Type with Locale" = Table.TransformColumnTypes(#"Added Suffix", {{"Datetime", type datetime}}, "en-NA"),
    #"Changed Type" = Table.TransformColumnTypes(#"Changed Type with Locale",{{"value", type number}})
in
    #"Changed Type"

 

I have a column which has tag names and here i have sample data of two tags for two days.

The columns i have here as Datetime, NAME and value columns.

for each name i want to fill the blank values using interpolation.

I have tried these below blogs and measures 

https://community.powerbi.com/t5/Community-Blog/Linear-Interpolation-with-Power-BI/ba-p/341202

https://stackoverflow.com/questions/68416307/power-bi-power-query-m-linear-interpolation-over-time-series-data

Written dax as below. but somehow its not working.

 

Interpolated Value = 

VAR x3 = CALCULATE(MAX(Trends2[Datetime]),ALLEXCEPT(Trends2,Trends2[Name]))
VAR match = CALCULATE(MAX(Trends2[value]),FILTER(ALLEXCEPT(Trends2,Trends2[Name]),Trends2[Datetime]=x3))
VAR x1 = CALCULATE(MAX(Trends2[Datetime]),FILTER(ALLEXCEPT(Trends2,Trends2[Name]),Trends2[Datetime]<=x3))
VAR x2 = CALCULATE(MIN(Trends2[Datetime]),FILTER(ALLEXCEPT(Trends2,Trends2[Name]),Trends2[Datetime]>=x3))
VAR y1 = CALCULATE(MAX(Trends2[value]),FILTER(ALLEXCEPT(Trends2,Trends2[Name]),Trends2[Datetime]<=x3))
VAR y2 = CALCULATE(MIN(Trends2[value]),FILTER(ALLEXCEPT(Trends2,Trends2[Name]),Trends2[Datetime]>=x3))
RETURN IF(NOT(ISBLANK(match)),match,y1 + (x3 - x1) * (y2 - y1)/(x2 - x1))

 

Can anyone please help me with the right dax to calcualte the interpolation as per my data.

 

Thanks,

Mohan V.

 

3 Replies

  • Anonymous's avatar
    Anonymous
    Not applicable

    Greg_Deckler Can you please have a look at the data and help me here please.

     

     

  • Anonymous's avatar
    Anonymous
    Not applicable

    Please help.

  • v-zhangti's avatar
    v-zhangti
    Community Support

    Hi, Anonymous 

     

    You can try the following methods.

    Interpolated Value = 
    VAR x3 = CALCULATE(MAX(Trends2[Datetime]),ALLEXCEPT(Trends2,Trends2[Name]))
    VAR match = CALCULATE(MAX(Trends2[value]),FILTER(Trends2,Trends2[Datetime]=x3&&[Name]=SELECTEDVALUE(Trends2[Name])))
    VAR x1 = CALCULATE(MAX(Trends2[Datetime]),FILTER(Trends2,Trends2[Datetime]<=x3&&[Name]=SELECTEDVALUE(Trends2[Name])))
    VAR x2 = CALCULATE(MIN(Trends2[Datetime]),FILTER(Trends2,Trends2[Datetime]>=x3&&[Name]=SELECTEDVALUE(Trends2[Name])))
    VAR y1 = CALCULATE(MAX(Trends2[value]),FILTER(Trends2,Trends2[Datetime]<=x3&&[Name]=SELECTEDVALUE(Trends2[Name])))
    VAR y2 = CALCULATE(MIN(Trends2[value]),FILTER(Trends2,Trends2[Datetime]>=x3&&[Name]=SELECTEDVALUE(Trends2[Name])))
    RETURN 
    IF(match<>BLANK(),match,y1 + (x3 - x1) * (y2 - y1)/(x2 - x1))

    If that doesn't solve your problem, what is your expected output?

     

    Best Regards,

    Community Support Team _Charlotte

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.