You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将MIKE Operations中等距时间轴的小时dfs0转为非等距?

解决方案:强制MIKE SDK生成非等距时间轴的DFS0文件

我之前也踩过这个坑——MIKE SDK的Dfs0.write()确实会自动检测时间间隔,默认把小时级的等距时间序列写成等距轴,哪怕我们想要非等距的。下面分享两个亲测有效的解决办法:

方法1:手动构建非等距时间轴(最规范)

直接绕过DataFrame自动推断的逻辑,手动创建NonEquidistantTimeAxis对象来定义时间轴,再构建数据集写入。这种方法完全可控,适合对数据精度要求高的场景:

from mikeio import Dfs0, Dataset, DataArray
from mikeio.eum import ItemInfo
from mikeio.time import NonEquidistantTimeAxis

# 加载原始等距DFS0到DataFrame
dfs_input = Dfs0("your_input_hourly.dfs0")
df = dfs_input.to_dataframe()

# 提取时间序列并创建非等距时间轴
time_points = df.index.to_list()
non_eq_time_axis = NonEquidistantTimeAxis(time_points)

# 逐个构建DataArray并组装成Dataset
data_arrays = []
for col_name in df.columns:
    da = DataArray(
        data=df[col_name].values,
        time=non_eq_time_axis,
        item=ItemInfo(name=col_name)
    )
    data_arrays.append(da)
ds = Dataset(data_arrays)

# 写入非等距DFS0文件
ds.to_dfs("your_output_non_equidistant.dfs0")

方法2:给时间轴加微小偏移(快速取巧)

如果不想写太多底层代码,可以给每个时间点加一个极其微小的时间偏移(比如1微秒),让SDK认为时间间隔不相等,从而自动使用非等距轴。这个方法适合对时间精度要求不高的场景:

import pandas as pd
from mikeio import Dfs0

# 加载原始数据
dfs_input = Dfs0("your_input_hourly.dfs0")
df = dfs_input.to_dataframe()

# 给每个时间戳添加1微秒的偏移,打破等距性
df.index = df.index + pd.Timedelta(microseconds=1)

# 写入文件,此时SDK会识别为非等距时间轴
Dfs0.write("your_output_non_equidistant.dfs0", df)

注意事项

  • 方法1是官方推荐的规范做法,完全不会修改原始时间数据;
  • 方法2的偏移量极小,几乎不会影响数据的实际使用,但如果你的业务对时间精度要求到微秒级,不建议使用;
  • 生成的非等距DFS0文件完全兼容MIKE Operations的运行模式,可以正常加载使用。

内容的提问来源于stack exchange,提问作者NDen

火山引擎 最新活动