So I converted my polygon layer into a raster, set the cell sizes to be the same as the raster I want stats from (25m). Then I converted that back into polygons to run zonal stats to see what was going on.
The first run I did when reconverting back to polygons I allowed it to simplify the polygons, thinking I'd get more 'organic' shapes and maybe a but closer to the original. Ran zonal stats and again was coming back with a bunch of empty fields. Typically they were all small, which was expected, some a bit smaller than the raster cell size (because they were simplified). Even so, many of these undersized ones could still be calculated. Flicking through them I noticed that many of the unsuccessful ones were 'sharing' cells and mustn't have had the largest portion compared to their neighbour. However, there were cases where they weren't sharing cells or were even little islands away from other polygons, some just would not calculate.
I did this again but this time I unchecked the simplify polygon box to see if that made a difference. This essentially halved the failure rate, but still had some left overs, same as before. Only this time, since no polygon could be smaller than a cell, even the smallest polygons had to be over greater portion of a cell (except in cases where it would be perfectly aligned over four cells, but that would be very rare).
When I tried to run zonal stats with the left overs (as I had done successfully many times with my orginal shapefiles), it would not run - error 10423. Tried trimming the groups, still nothing.
So, why is it breaking? If you have a square over a grid with cells the same size as your square, unless the corners are perfectly aligned with the centres of each cell, you must have a greater portion of one of the cells and the centroid of a cell within the boundary of your square. So how is it deciding which cells to include?
Definately, very small polygons won't work, but I still think cell sharing can explain part of it. Perhaps the order they are done? I can't see one though, failed cases can appear at random; it doesn't matter if the neighbour cells are left, right, up, down or before or after their object ID number. I can't see a pattern. Even so, that doesn't explain the failed cases where there are no neighbours.
So I conclude that I can't work it out and am going to get back to work now 🙂