如何将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




