Ploty图表在多源数据下出现崩溃

后端开发 2026-07-11

我正在开发一个仪表板,用于交互式显示主题公园的排队等待时间。我有一个脚本在运行,每5分钟轮询一次网络API以获取等待时间。基于这个脚本,我有一系列按日期和游乐项目排序的CSV文件,每个文件都包含采样时间以及各个游乐项目的等待时间。

在我的Dash应用中,我使用pandas将 CSV读取到数据框,然后再用plotly绘制图形。单个游乐项目时工作正常,但当存在多个游乐项目时,一些条目显示顺序错乱:图形显示某些时间条目仅属于一个数据集,被追加到图表末端

请注意那条红线往往会跑到图的边缘,看起来很不正常。

这些是我用来加载数据的函数:

    def update_data_frame(self, name, date):
        name = name.replace(' ', '_')
        df = self.load_data(date, name, "tds")
        self.frame = pd.concat([self.frame, df], axis=0, ignore_index=True)

        self.frame = self.frame.sort_values(by="last_updated", ignore_index=True)
        self.fig = px.line(
            self.frame, 
            x='last_updated', 
            y='wait_time', 
            title="Wait Times", 
            labels={'last_updated': "Last Updated", 'wait_time': "Wait Time (min)"},
            color='ride'
        )

    def load_data(self, date, ride_name, park_name): 
        filename = f"{os.getenv('SAVE_PATH')}{park_name}/{date}/{date}_{ride_name}.csv"
        df = pd.read_csv(filename, header=0, delimiter = ', ')
        for key, entry in df["last_updated"].items():
            entry = re.match(r".* (\d\d:\d\d):\d\d\+09:00", entry)[1]
            print(f"{ride_name} {entry}")
            df.loc[key, "last_updated"] = entry
        df["ride"] = full(len(df), f"{date}-{ride_name}")
        return df

通过检查数据,我发现这些怪异的跳变只有在每天采样时间不一致时才会发生。我尝试通过将时间截断到分钟来解决,但有时所用的API会错时更新,结果你看到的混乱又出现了。

我在把这些游乐项目加入数据框后,尝试打印数据框以查看数据是否有序,但在我看来似乎没问题:

    last_updated  wait_time  is_open                                     ride
0          00:01          0    False                     2026-03-18-Aquatopia
1          00:01          0    False  2026-02-01-20,000_Leagues_Under_the_Sea
2          00:06          0    False  2026-02-01-20,000_Leagues_Under_the_Sea
3          00:06          0    False                     2026-03-18-Aquatopia
4          00:11          0    False                     2026-03-18-Aquatopia
..           ...        ...      ...                                      ...
569        23:46          0    False                     2026-03-18-Aquatopia
570        23:51          0    False  2026-02-01-20,000_Leagues_Under_the_Sea
571        23:51          0    False                     2026-03-18-Aquatopia
572        23:56          0    False                     2026-03-18-Aquatopia
573        23:56          0    False  2026-02-01-20,000_Leagues_Under_the_Sea

如果数据在数据框中是无序的,我会预计额外的条目会出现在末尾,就像它们在图表的末尾那样。

任何帮助将不胜感激。

解决方案

Plotly似乎不太喜欢这些 "HH:MM" 时间字符串。我可以用类似18:41的“有问题的时间”很容易复现你的问题,它会被放在x 轴的最末端。

我本来以为plotly会把这些时间字符串视为“分类数据”(因为它只是一个字符串),并按底层数据中出现的顺序进行布局(这篇关于按分类轴排序的说明)。但也许在按游乐项目拆分数据的过程中,顺序又被重新打乱了。

一个变通的办法是将这些“时间字符串”转换为datetime,从而防止plotly将其视为分类数据:

self.frame['last_updated'] = pd.to_datetime(self.frame['last_updated'], format = '%H:%M')
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章