0

I am trying to extract the sum of PI data from OSIsoft 10m (10 minute) data in a one (1) month interval using Python pandas. However, I either get an error from OSIsoft or Python when I choose the internal notation as "M" for OSIsoft or "1mo" for python. Neither notation seems to work w/out an error. I have a function that calls the interval of data to plot and save and this works for intervals of "1d", "30d", "1w", "1y" for example but I cannot get the sum of data for each 1-month interval. Is it a conflict of how python requires a description of "month" with an "M" and OSISoft that requires "1mo"?? thank you, Here is my code:

def get_tag_history2(tagname, starttime, endtime, interval="10m"):
    # pull historical data
    tag = PIPoint.FindPIPoint(piServer, tagname)
    # name = tag.Name.lower()
    timerange = AFTimeRange(starttime, endtime)
    span = AFTimeSpan.Parse(interval)
    #summariesvalues
    summaries = tag.Summaries(timerange, span, AFSummaryTypes.Average, AFCalculationBasis.TimeWeighted, AFTimestampCalculation.Auto)
    recordedValuesDict = dict()
    for summary in summaries:
        for event in summary.Value:
            dt = datetime.strptime(
                event.Timestamp.LocalTime.ToString(),'%m/%d/%Y %I:%M:%S %p')
            recordedValuesDict[dt] = event.Value
    # turn dictionary into pd.DataFrame
    df = pd.DataFrame(
        recordedValuesDict.items(), columns=['TimeStamp', 'Value'])
    #Send it to a dateTime Index then set the index 
    df['TimeStamp'] = pd.to_datetime(df['TimeStamp']) + pd.Timedelta(interval)
    df.set_index(['TimeStamp'], inplace=True)
    return df


if __name__ == '__main__':
    """
    Set inputs
    """
    pitags = ['JC1.WF.DOMINA.ProdEffective','HO1.WF.DOMINA.ProdEffective','BC1.WF.DOMINA.ProdEffective']
    start_time = '2020-01-01 00:00'
    end_time = '2022-01-01 00:00'
    interval = "M"
    
    """
    Run Script
    """
    connect_to_Server('PDXPI01')
    output = pd.DataFrame()
    for tag in pitags:
        values = get_tag_history2(
            tag, start_time, end_time, interval=interval)
        output[tag] = values['Value']
    
    for i, col in enumerate(output.columns):
        output[col].plot(fig=plt.figure(i))
        plt.title(col)
    
plt.show()

The error when using interval = "1mo" is --- >

ValueError: invalid unit abbreviation: mo

The error when using interval = "M" is --- >

FormatException: The 'M' token in the string 'M' was not expected.
   at OSIsoft.AF.Time.AFTimeSpan.FormatError(String input, Char token, Boolean throwErrors, AFTimeSpan& result)
user2100039
  • 1,280
  • 2
  • 16
  • 31

1 Answers1

1

There is a conflict between how pandas and AFSDK takes time units for intervals.

You would need to modify the interval string before sending it to AFTimeSpan.Parse(interval):

interval_pi = interval.replace("M","mo")
span = AFTimeSpan.Parse(interval_pi) 
Zhengqi Ge
  • 11
  • 3