您可以将Wolfram 语言应用到您的项目中。有一个免费的Wolfram 引擎供开发人员使用,可插入许多 IDE。它还有用于 Python 的Wolfram 客户端库以在 Python中使用这些函数。
我认为有一个 API 可以将数据作为 JSON 或 CSV 或这些或其他格式的流获取。根据 API,您可以使用HTTP 请求和响应指南或Web 操作指南中的函数。
由于没有提供数据,我将从生成定时情绪运行开始。为了确保有运行,我将使用DiscreteMarkovProcess带有转换矩阵的 a ,该矩阵略微偏向于当前状态而不是移动到另一个状态。
MatrixForm[tm = {{0.6, 0.4}, {0.4, 0.6}}]

Graph可以采用 aDiscreteMarkovProcess所以可以将其可视化为
mood = DiscreteMarkovProcess[1, tm];
Graph@mood

或为清晰起见进行一些格式化。
Graph[
Flatten@MapIndexed[Labeled[DirectedEdge @@ #2, #1] &, tm, {2}],
VertexSize -> Medium,
VertexStyle -> LightGreen,
VertexLabels -> Thread[Range[2] -> Map[Placed[#, Center] &, {"Happy", "Sad"}]]
]

RandomFunction将模拟这个过程,我会将整数值转换为文本,ReplaceAll (/.)以便具有与 ElasticSearch 中相同的数据类型。DateRange将用于创建相隔 2 小时的时间戳,如您的示例所示。
SeedRandom[987]
n = 20;
data = Transpose@
{
With[{start = DateObject@{2019, 1, 1, 0}},
DateRange[start, DatePlus[start, {2 n, "Hour"}], Quantity[2, "Hour"]]
],
RandomFunction[mood, {0, n}]["Values"] /. Thread[Range@2 -> {"Happy", "Sad"}]
};
这给出了下面的快乐-悲伤序列,如下所示DateListPlot。
DateListPlot[KeySort@GroupBy[Last]@data /. Thread[{"Happy", "Sad"} -> Range@2],
Joined -> False]

现在有了数据,就可以开始实际工作了。前 2 项是
data[[;; 2]]

data可以是每个项目中SplitBy的Last值。这些运行可以是Transposed ,因此有一行DateObjects 和一个字符串值。Apply (@@@)输入MinMax日期和First值(因为它们对于每次运行都是相同的)获取每次运行的起点和终点。
runs = {MinMax@#1, First@#2} & @@@ Transpose /@ SplitBy[data, Last]

我已决定在之前的运行结束后立即开始运行,并在其最后一个数据点结束。因此,我需要包含上一次运行的终点来计算运行的运行时间。通过Fold成对的列表 ( FoldPairList)可以计算前一个结尾和当前结尾之间的中间值DateDifference。"Hour"
runTimes =
FoldPairList[
{
{DateDifference[##, "Hour"] & @@ MinMax@Rest@Flatten@{##}[[All, 1]], Last@#2},
#2
} &,
First@runs,
runs
]

DateDifference返回Quantity请求的时间单位的对象。
runTimes[[1, 1]] // InputForm
Quantity[8, "Hours"]
数量对象在整个语言中都是已知的,因此可以从这里继续进行进一步的处理或分析。例如像这样的BarChart可视化
BarChart[Labeled @@@ runTimes, ChartLabels -> Automatic, AxesLabel -> Automatic]

请注意,小时的缩写被Automatic放置为AxesLabel.
希望这可以帮助。