为了实现自动识别每个月的数据组数,可以在 fillMissingData 方法中添加如下代码:

// 存储每个月的数据组数 List groupCounts = new ArrayList<>(); // 存储当前月份 int currentMonth = -1; // 遍历每一行 for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); if (row != null) { Cell cell = row.getCell(0); if (cell != null && cell.getCellType() == CellType.STRING) { String dateString = cell.getStringCellValue(); Date date = parseDate(dateString); if (date != null) { int month = date.getMonth(); if (month != currentMonth) { if (currentMonth != -1) { groupCounts.add(i - 1); } currentMonth = month; } } } } } if (currentMonth != -1) { groupCounts.add(sheet.getLastRowNum()); }

这段代码会遍历每一行,解析日期并获取月份,如果月份发生变化,则将上一个月的数据组数添加到 groupCounts 列表中,最后将最后一个月的数据组数也添加到列表中。

接下来,可以使用 groupCounts 列表来判断每个月的数据组数,如果不够五组,则插入日期和数据。代码如下:

// 遍历每个月的数据组数 for (int i = 0; i < groupCounts.size() - 1; i++) { int startRow = groupCounts.get(i) + 1; // 当前月份的起始行 int endRow = groupCounts.get(i + 1); // 下一个月份的起始行 int rowCount = endRow - startRow; // 当前月份的数据组数 if (rowCount < 5) { // 如果数据组数不足五组 Date startDate = parseDate(sheet.getRow(startRow).getCell(0).getStringCellValue()); // 获取起始日期 Date endDate = parseDate(sheet.getRow(endRow - 1).getCell(0).getStringCellValue()); // 获取结束日期 int monthCount = getMonthCount(startDate, endDate); // 获取月份差 if (monthCount > rowCount) { // 如果缺失月份数大于当前月份的数据组数 for (int j = rowCount; j < 5; j++) { // 对每个缺失的月份进行处理,最多补到五组 Row newRow = sheet.createRow(startRow + j); // 创建新的行 Cell newCell = newRow.createCell(0); // 创建新的单元格 Date newDate = getNextMonth(startDate, j + 1); // 获取下一个月的日期 newCell.setCellValue(dateFormat.format(newDate)); // 将日期填入单元格 double avg = calculateKNN(sheet, startRow - 1); // 计算KNN邻近算法填充的值 if (avg > 0) { // 如果填充的值大于 0 Cell valueCell = newRow.createCell(1); // 创建新的单元格 valueCell.setCellValue(Double.parseDouble(df.format(avg))); // 将填充的值填入单元格 } } } } }

这段代码会遍历每个月的数据组数,如果数据组数不足五组,则根据起始日期和结束日期计算缺失的月份数,并在每个缺失的

Excel 数据恢复:自动填充缺失数据 (KNN 算法和时间规律)

原文地址: https://www.cveoy.top/t/topic/f2kR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录