chronaxis.execution.record_sample_series
源码基线:8904c2f744951857659abd40aaa3535d57faf53c
1"""把一小批实际记录及有效截止交给既有样本统计/选择核。23只在当前批插入必要的失效边界,不保存另一条时间轴;这些边界的真实更新标志为False。4半开范围及共享右端由原CalculationSeries/CalculationDefinition处理,不把保持值当作新样本。5"""6from ..core.calculations import CalculationSeries7from ..core.models import Interval8from ..core.numeric import ScalarValue9from ..core.types import QualityFlag as Q101112def sample_series(rows,unit,conditioned):13 """构造有界核输入。参数: 至少两点的内部行/单位/条件开关。返回: CalculationSeries。异常: 类型/时间错误。"""14 times=[];values=[];conditions=[];updates=[]15 for index,row in enumerate(rows):16 time,value,deadline,condition,condition_end=row[:5]17 end=rows[index+1][0] if index+1<len(rows) else time18 # 每对最多两个不同过期点;不插入计算所选固定周期的虚构时刻。19 points=(time,*sorted({d for d in (deadline,condition_end) if d is not None and time<d<end}))20 for point in points:21 times.append(point)22 values.append(ScalarValue(None,value.dtype,False,value.quality|Q.STALE,value.labels)23 if deadline is not None and point>=deadline and point<end else value)24 if conditioned:25 conditions.append(ScalarValue(None,condition.dtype,False,condition.quality|Q.STALE,condition.labels)26 if condition_end is not None and point>=condition_end and point<end else condition)27 updates.append(bool(row[5]) if point==time and len(row)>5 else False)28 return CalculationSeries(Interval(times[0],times[-1]),tuple(times),tuple(values),tuple(updates),unit,29 conditions=tuple(conditions) if conditioned else None)30