CompareSG

What food is in season in Singapore?

Durians land in July, mandarins in January. Pick a food to see the months it arrives in Singapore, from ten years of monthly food imports, 2016 to 2025.

My food

10 foods that arrive in a clear season, the most seasonal first.

When do durians arrive?

Each bar is one month: how much of a year's imports of this food arrive then, averaged over 2016 to 2025. The busiest 3 months are filled in, and the dashed line is an even spread (about 8% a month). A season that crosses the end of the year shows at both ends.

54%

of a year's durian imports (by value) arrive in June to August. An even spread would put 25% there.

JanJFebFMarMAprAMayMJunJJulJAugASepSOctONovNDecD
Busiest month: JulyBusiest month fell in Jun–Aug in 9 of 10 yearsAbout US$13 million of imports a year

What this covers: Durians, fresh.

Busiest 3 monthsOther monthsEven spread

Durians: more than half of a year's imports, 54 out of every 100 dollars, arrive in June to August. An even spread would put 25 there.

What arrives in each month?

Each card lists the foods in the picker that are in their busiest 3 months then. The food you picked is in colour, and its months have a coloured edge.

January

  • Mandarins
  • Prepared abalone
  • Dried scallops
  • Prepared clams
  • Candied fruit
  • Prepared shrimp

February

  • Mandarins

March

No food in the picker is busiest now

April

  • Guavas, mangoes, mangosteens

May

  • Guavas, mangoes, mangosteens

June

  • Durians
  • Peaches
  • Guavas, mangoes, mangosteens

July

  • Durians
  • Peaches

August

  • Durians
  • Peaches

September

No food in the picker is busiest now

October

  • Persimmons

November

  • Persimmons
  • Prepared abalone
  • Dried scallops
  • Prepared clams
  • Candied fruit
  • Prepared shrimp

December

  • Prepared abalone
  • Dried scallops
  • Prepared clams
  • Candied fruit
  • Prepared shrimp
  • Mandarins
  • Persimmons

Busiest monthOne of the busiest 3 months

March and September are the only months in which none of the 10 foods is at its busiest.

Highlighted: the months when durians are busiest (June to August). Other foods in the picker that are also busiest in some of those months: peaches and guavas, mangoes and mangosteens.

Do durians arrive at the same time every year?

Each row is one year. The bars show how that year's durian imports spread over the 12 months, and the tallest bar is the busiest month. Shaded columns are the usual busiest 3 months (Jun–Aug).

In 9 of the 10 years, the busiest month for durians was June, July or August. The exception was 2017 (December), when the busiest month fell outside those three.

Which foods are the most seasonal?

Each bar is the share of a year's imports that arrive in the food's busiest 3 months. The dashed line is an even spread (25%). Hatched bars are fresh foods with no clear season, for comparison. Hover or tap a row for details, and click to pick it.

For comparison: fresh foods with no clear season
–Spinachno clear season25%of the year
–Pumpkinsno clear season26%of the year
–Garlicno clear season26%of the year

Busiest 3 monthsEven spread (25%)No clear season

Ranked third of 10: 54% of a year's durian imports arrive in the busiest 3 months. The most seasonal, mandarins, has 66%. An even spread would be 25%.

Fun finds

How much of the mandarin year lands in one month?
January: 45 out of every 100 dollars
45% of a year's mandarin imports arrive in January alone. Add December (15%) and February (6%) and it is 66%. None of the other nine months holds more than 6%.
Is there a second durian season?
A late burst in 2017, 2022 and 2025
In those years, November and December brought 35%, 25% and 26% of the year's durian imports. In the other 7 years it was 10% or less. This shows when, not why.
Which fresh foods have no season?
Spinach, pumpkins and garlic
Their busiest 3 months bring 25% to 26% of a year's imports. That is what an even spread gives (25%).

The short version

Of 740 foods and food products in Singapore's monthly import records for 2016 to 2025, 10 arrive in a clear season. Mandarins are the most seasonal (66 out of every 100 dollars of a year's imports arrive in December to February), durians come mostly in June to August (54 out of every 100), and persimmons in October to December (58 out of every 100).

What we did. We took Singapore's monthly imports of food from the UN Comtrade database, one line for each 6-digit trade code, in US dollars, for the 10 full years 2016 to 2025. For each food and each year we worked out what share of that year's imports arrived in each month, then averaged the ten years. The busiest 3 months are the busiest month and the month on each side. A food goes in the picker when its busiest month is the same, give or take one, in at least 9 of the 10 years, it agrees when counted by weight, it is a named food and not a catch-all code, and at least 30% of a year's imports arrive in its busiest 3 months.

What we found. 10 of the 228 foods with steady imports pass. Mandarins are the most seasonal: 66% of a year's imports arrive in December to February, and 45% in January alone. Durians arrive mostly in June to August (54%), with July the busiest month, and peaches share those months. Persimmons come in October to December, and guavas, mangoes and mangosteens in April to June. Five foods are busiest in December: prepared abalone, dried scallops, prepared clams, candied fruit and prepared shrimp. March and September are the only months in which none of the 10 foods is at its busiest.

What to keep in mind. This is when food arrives in Singapore, not when it is grown, cheapest or eaten, and imports include food later sent on to other countries. The shares are by value, and each picked food's busiest month is the same by weight. 15 foods that passed the early tests are left out, and the Numbers section says why. We do not say why a food arrives when it does.

By Ben (opens in a new tab). Updated . Data: UN Comtrade, Singapore's monthly imports by 6-digit trade code, 2016 to 2025.

Questions people ask

When is durian season in Singapore?

Durians arrive in Singapore mostly in June to August. In 2016 to 2025, 54 out of every 100 dollars of a year's durian imports arrived in those three months, and July was the busiest month. In 9 of the 10 years the busiest month was June, July or August; the exception was 2017, when December was busiest. This shows when durians are imported, not what they cost or how they taste.

Is there a second durian season in Singapore?

A late burst came in 2017, 2022 and 2025: November and December brought 35%, 25% and 26% of those years' durian imports. In the other 7 years it was 10% or less. We show when, not why.

What fruits are in season in Singapore?

From import records, mandarins (Dec–Feb), persimmons (Oct–Dec), durians (Jun–Aug), peaches (Jun–Aug) and guavas, mangoes and mangosteens (Apr–Jun) arrive in a clear season. This is about fruit that comes into Singapore, so it says nothing about fruit grown here.

When do mandarin oranges arrive in Singapore?

Mandarins are the most seasonal food in the picker: 66 out of every 100 dollars of a year's imports arrive from December to February, and January alone brings 45. In all 10 years the busiest month was December, January or February.

Which food has the clearest season?

Mandarins, with 66% of a year's imports in their busiest 3 months, then persimmons (58%) and durians (54%). An even spread would put 25% there.

Do all foods have a season?

No. Of 228 foods with steady imports, only 25 had the same busiest month (give or take one) in at least 9 of the 10 years. Spinach, pumpkins and garlic spread their imports almost evenly: 25% to 26% of a year's imports in their busiest 3 months.

Does this say when to buy or eat a food?

No. It counts the month a food enters Singapore, measured by its value in US dollars. We do not know what happens to a food after it arrives, how long it is kept, or when it is eaten.

Is this when food is grown in Singapore?

No. These are imports: food that enters Singapore, including food that is later sent on to other countries.

How were the foods picked?

We started with 740 foods and food products in the food chapters of the trade code book. 228 were imported in every one of the 10 years, at least US$5 million a year with steady totals. 25 had the same busiest month, give or take one, in at least 9 years. 21 also agreed when counted by weight. 15 were not catch-all codes. 10 had at least 30% of a year's imports in their busiest 3 months.

Why are some foods not in the picker?

4 foods agreed on the busiest month by value but not by weight, 6 are catch-all codes ("not elsewhere classified") that mix different foods, and 5 were too close to an even spread. The Numbers section lists each one.

Do 2020 and 2021 change the answer?

Not the months. Leaving out 2020 and 2021, 9 of the 10 foods keep the same busiest month and dried scallops moves by one month (December to November). A food's share of the year in its busiest 3 months moves by at most 4.6 points.

Why do these foods arrive in these months?

This page shows when foods arrive, not why. We do not claim a reason.

The numbers behind it

The foods in the picker, most seasonal first
RankFoodWhat the code coversTrade codeBusiest monthBusiest 3 monthsShare of a year in those 3 monthsYears with the same busiest 3 monthsBusiest month by weightAverage imports a year (US$ million)
1MandarinsMandarins, tangerines, satsumas, clementines and similar citrus, fresh or dried0805.20 to 0805.29, joinedJanuaryDec–Feb66%10 of 10January28.0
2PersimmonsPersimmons, fresh0810.70NovemberOct–Dec58%10 of 10November5.8
3DuriansDurians, fresh0810.60JulyJun–Aug54%9 of 10July13.4
4Prepared abaloneAbalone, prepared or preserved1605.57DecemberNov–Jan51%9 of 10December54.9
5Dried scallopsScallops, dried, salted, in brine or smoked0307.29DecemberNov–Jan49%9 of 10December12.2
6PeachesPeaches and nectarines, fresh0809.30JulyJun–Aug42%10 of 10July11.8
7Prepared clamsClams, cockles and arkshells, prepared or preserved1605.56DecemberNov–Jan42%10 of 10December5.1
8Candied fruitFruit, nuts, peel and other plant parts preserved by sugar (drained, glacé or crystallised)2006.00DecemberNov–Jan32%9 of 10December9.5
9Guavas, mangoes, mangosteensGuavas, mangoes and mangosteens, fresh or dried0804.50MayApr–Jun31%10 of 10May30.4
10Prepared shrimpShrimps and prawns, prepared or preserved, not in airtight containers1605.21DecemberNov–Jan31%9 of 10December32.8

Share of a year: the average of ten yearly shares, so a big year does not outweigh a small one.

Share of a year's imports that arrives in each month, average of 2016 to 2025 (%)
FoodJanFebMarAprMayJunJulAugSepOctNovDecTotal
Mandarins45.36.45.03.32.32.73.84.34.14.03.914.8100.0
Persimmons7.31.21.44.89.49.43.51.53.717.223.017.8100.0
Durians5.02.84.94.36.017.521.815.25.73.75.47.9100.0
Prepared abalone11.51.41.82.22.84.27.08.58.413.016.722.5100.0
Dried scallops13.35.74.13.04.85.54.65.29.28.516.619.5100.0
Peaches10.79.47.02.06.610.815.615.38.53.13.37.6100.0
Prepared clams14.33.85.86.04.04.38.56.48.810.811.815.6100.0
Candied fruit9.85.68.17.68.37.67.77.37.48.310.212.1100.0
Guavas, mangoes, mangosteens6.76.59.010.011.59.68.47.86.57.38.28.5100.0
Prepared shrimp10.15.57.87.97.87.97.88.57.88.49.710.9100.0
Imports each year (US$ million), and the smallest year as a share of the biggest
Food2016201720182019202020212022202320242025Smallest / biggest
Mandarins25.319.925.525.822.332.834.525.637.430.953%
Persimmons6.26.35.35.26.77.16.54.44.85.062%
Durians8.69.013.814.211.116.915.215.912.916.751%
Prepared abalone63.455.469.064.638.865.361.146.948.036.152%
Dried scallops22.726.513.612.07.17.810.27.39.05.420%
Peaches9.79.011.312.611.612.811.012.313.614.263%
Prepared clams7.35.46.16.03.13.94.85.14.94.543%
Candied fruit10.710.510.69.48.89.88.78.39.39.078%
Guavas, mangoes, mangosteens29.431.435.731.631.834.427.928.925.927.173%
Prepared shrimp45.839.835.432.524.326.233.027.129.934.353%
Foods that passed the first tests but are not in the picker
Trade codeWhat the code coversWhy it is left outBusiest month (value)Busiest month (weight)Share of a year in busiest 3 monthsAverage imports a year (US$ million)
0810.90Fruits n.e.c. in heading no. 0801 to 0810, freshBusiest month by weight is not within a month of the busiest month by valueJuneAugust33%34.7
1806.90N.e.c. in chapter 18Busiest month by weight is not within a month of the busiest month by valueNovemberSeptember32%104.9
2008.19Whether or not containing added sugar, other sweetening matter or spirit (excluding ground-nuts except in mixtures)Busiest month by weight is not within a month of the busiest month by valueDecemberApril31%69.6
2103.90Mixed condiments and mixed seasoningsBusiest month by weight is not within a month of the busiest month by valueDecemberOctober28%142.1
0301.99Live, n.e.c. in heading 0301Catch-all code (not elsewhere classified)JanuaryDecember30%17.7
0303.89Frozen, n.e.c. in heading 0303, excluding fillets, fish meat of 0304, and edible fish offal of subheadings 0303.91 to 0303.99Catch-all code (not elsewhere classified)DecemberDecember30%19.0
0703.90Leeks and other kinds n.e.c. in heading no. 0703, fresh or chilledCatch-all code (not elsewhere classified)JanuaryJanuary35%7.3
0709.59Truffles and mushrooms n.e.c. in heading 0709, fresh or chilledCatch-all code (not elsewhere classified)JanuaryJanuary29%22.5
0712.39Mushrooms and truffles n.e.c. in item 0712.3, whole, cut, sliced, broken or in powder but not further prepared, driedCatch-all code (not elsewhere classified)DecemberDecember40%8.6
0813.40Fruit n.e.c. in heading no. 0812, driedCatch-all code (not elsewhere classified)DecemberDecember33%7.4
0307.11Oysters, whether in shell or not, live, fresh or chilledUnder 30% of a year's imports in the busiest 3 monthsDecemberDecember29%5.6
0705.11Cabbage (head) lettuce (lactuca sativa), fresh or chilledUnder 30% of a year's imports in the busiest 3 monthsJanuaryJanuary27%11.9
0706.90Salad beetroot, salsify, celeric, radishes and similar edible roots, fresh or chilledUnder 30% of a year's imports in the busiest 3 monthsJanuaryJanuary28%10.5
0709.20Asparagus, fresh or chilledUnder 30% of a year's imports in the busiest 3 monthsJanuaryFebruary28%8.6
1905.31Sweet biscuits, whether or not containing cocoaUnder 30% of a year's imports in the busiest 3 monthsDecemberDecember30%81.4
For comparison: fresh foods with no clear season (not in the picker)
Trade codeWhat the code coversShare of a year in busiest 3 monthsBiggest single monthAverage imports a year (US$ million)
0709.70Spinach, New Zealand spinach and orache spinach, fresh or chilled25%9%15.4
0709.93Pumpkins, squash and gourds, fresh or chilled26%9%21.7
0703.20Garlic, fresh or chilled26%9%24.3

The boring bit

Where the data comes from

UN Comtrade, the United Nations' database of trade between countries. We took Singapore's imports by month (period) and 6-digit Harmonized System code, with all origins together, for food and farm chapters 01 to 24, downloaded on 11 Oct 2026 with a free key. We kept the food chapters (2 to 4, 7 to 11, 16 to 22). Value is in US dollars; the weight cross-check uses net weight in kilograms.

What is not claimed

  • Arrival is not eating. The month is when the food is recorded as entering Singapore. It is not when the food is grown, cheapest, freshest or eaten.
  • Imports are not what Singapore eats. Some of what enters is later sent on to other countries, and we cannot tell how much.
  • The shares are by value in US dollars. A food whose price moves through the year can look different by weight, so we check that the busiest month agrees by weight too. Four foods that pass by value but not by weight are left out.
  • A food in the picker does not mean no other food has a season. We only judge foods imported every year, at least US$5 million a year on average, with a name that is not a catch-all.
  • The 30% rule is our choice. An even spread would put 25% of a year in any 3 months. Candied fruit (32%), guavas, mangoes and mangosteens (31%) and prepared shrimp (31%) are only just over it.
  • 2020 and 2021 are among the 10 years, and COVID may have moved some shipments. Without them 9 of the 10 foods keep the same busiest month (dried scallops moves from December to November) and a food's share in its busiest 3 months moves by at most 4.6 points.
  • The mandarin code was split in 2018 (0805.20 became 0805.21, 0805.22 and 0805.29). We joined the four codes, as otherwise the years before and after 2018 could not be compared.
  • Catch-all codes ("not elsewhere classified") are left out because they mix different foods, so a season could come from any one of them. Cherries and dates are not in the picker.
  • Prepared and dried foods are included as the trade data names them. We do not say which dish or occasion they are for.
  • We do not say why a food arrives when it does, and we do not call any food better or worse than another.

Coverage

We used 75,852 monthly records for 743 trade codes in the food chapters, January 2016 to December 2025 (120 months). The four mandarin codes are counted as one food, so that is 740 foods. The file we downloaded holds 94,709 records for all food and farm chapters (01 to 24) from 2016-01 to 2026-03 (123 months); January to March 2026 is not a full year, so it is not used. A month with no record counts as no imports. Of the 740 foods, 228 had imports in all 10 years of at least US$5 million a year on average, with the smallest year at least a fifth of the biggest. Only those were judged.

Report an error. Corrections are logged publicly with a date.

How we did it
Monthly sharesBusiest 3 monthsWeight cross-checkCode joins
  1. Downloaded Singapore's imports for food and farm chapters 01 to 24, month by month from January 2016 to March 2026, one line per 6-digit trade code, all origins together, in US dollars and kilograms.
  2. Kept the food chapters and the 10 full years, 2016 to 2025, and joined the four mandarin codes.
  3. Divided each month by its year's total for each food, then averaged the ten yearly shares for each calendar month.
  4. Found the busiest month (the largest average share) and the busiest 3 months (that month and the two beside it), and added their shares.
  5. Counted the years in which that year's own busiest month falls within one month of the usual one.
  6. Applied the tests: imports every year, busiest month matching in 9 of 10 years, weight agrees, a named food, and at least 30% in the busiest 3 months. Ranked by that share.
  7. Checked it a second way: a separate script rereads the raw file with different code and gets the same busiest month, share and years for every food, and the page leaves out 2020 and 2021 as a test.
Show the Python code
YEARS = [str(y) for y in range(2016, 2026)]
FOOD_CHAPTERS = {2, 3, 4, 7, 8, 9, 10, 11, 16, 17, 18, 19, 20, 21, 22}
MIN_AVG_USD = 5_000_000
MIN_SMALLEST_OVER_BIGGEST = 0.2
MIN_YEARS_MATCH = 9
MIN_WINDOW_SHARE = 0.30
COMPARE = 3          # flattest foods shown for comparison (not picked)
JOINS = {"MANDARIN": ["080520", "080521", "080522", "080529"]}   # 0805.20 became 0805.21, .22 and .29 from 2018
MONTHS = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split()

def series(codes, table, years=YEARS):
    """{(year, month): total} for a food made of one or more codes."""
    out = defaultdict(float)
    for c in codes:
        for (cc, y, m), v in table.items():
            if cc == c and y in years:
                out[(y, m)] += v
    return out

def analyse(codes, value, weight, years=YEARS):
    s = series(codes, value, years)
    annual = {y: sum(s.get((y, m), 0.0) for m in range(1, 13)) for y in years}
    if min(annual.values()) <= 0:
        return None, "a year with no imports"
    avg = sum(annual.values()) / len(years)
    if avg < MIN_AVG_USD:
        return None, "under US$5m a year"
    if min(annual.values()) / max(annual.values()) < MIN_SMALLEST_OVER_BIGGEST:
        return None, "yearly total jumps (code change?)"
    share = [sum(s.get((y, m), 0.0) / annual[y] for y in years) / len(years) for m in range(1, 13)]
    peak = max(range(12), key=lambda i: share[i]) + 1
    win = [((peak - 2 + k) % 12) + 1 for k in range(3)]          # peak month and the months either side
    win_share = sum(share[m - 1] for m in win)
    busiest = {}
    for y in years:
        busiest[y] = max(range(1, 13), key=lambda m: s.get((y, m), 0.0))
    hits = sum(1 for y in years if min((busiest[y] - peak) % 12, (peak - busiest[y]) % 12) <= 1)
    # the same measure by weight, as a cross-check
    sw = series(codes, weight, years)
    wann = {y: sum(sw.get((y, m), 0.0) for m in range(1, 13)) for y in years}
    wpeak = None
    if all(v > 0 for v in wann.values()):
        wshare = [sum(sw.get((y, m), 0.0) / wann[y] for y in years) / len(years) for m in range(1, 13)]
        wpeak = max(range(12), key=lambda i: wshare[i]) + 1
    monthly = {y: [round(s.get((y, m), 0.0)) for m in range(1, 13)] for y in years}
    month_avg = [sum(s.get((y, m), 0.0) for y in years) / len(years) for m in range(1, 13)]
    yearly_win = {y: sum(s.get((y, m), 0.0) for m in win) / annual[y] for y in years}
    peak_month_record = max(((s.get((y, m), 0.0), y, m) for y in years for m in range(1, 13)))
    low_month_record = min(((s.get((y, m), 0.0), y, m) for y in years for m in range(1, 13)))
    return dict(
        avg_usd=avg, annual=annual, share=share, peak=peak, win=win, win_share=win_share, hits=hits,
        busiest=busiest, weight_peak=wpeak, month_avg=month_avg, monthly=monthly, yearly_win=yearly_win,
        record_high=list(peak_month_record), record_low=list(low_month_record),
        top_month_share=max(share), flat_ratio=max(share) * 12,
    ), "ok"

def circ(a, b):
    return min((a - b) % 12, (b - a) % 12)

# inside main(): which foods are picked
def pick(candidates, value, weight):
    steps, dropped, passed, analysed = {}, {}, {}, {}
    for key, cs in candidates:
        if int(cs[0][:2]) not in FOOD_CHAPTERS:
            continue
        steps["food chapters"] += 1
        res, why = analyse(cs, value, weight)
        if res is None:
            continue
        steps["enough imports every year"] += 1
        res["codes"] = cs
        res["description"] = desc.get(cs[0], "")
        analysed[key] = res
        if res["hits"] < MIN_YEARS_MATCH:
            continue
        steps["same busiest month in 9 of 10 years"] += 1
        if not res["weight_peak"] or circ(res["weight_peak"], res["peak"]) > 1:
            dropped["weight"].append(key)
            continue
        steps["weight agrees"] += 1
        if "n.e.c." in res["description"]:
            dropped["catchall"].append(key)
            continue
        steps["names a food"] += 1
        if res["win_share"] < MIN_WINDOW_SHARE:
            dropped["even"].append(key)
            continue
        steps["30% in busiest 3 months"] += 1
        ex, _ = analyse(cs, value, weight, [y for y in YEARS if y not in ("2020", "2021")])   # the same food without 2020 and 2021
        res["ex_covid_peak"] = ex["peak"] if ex else None
        res["ex_covid_win_share"] = ex["win_share"] if ex else None
        passed[key] = res

What could make it wrong: a code that was renamed or split part-way through the ten years (we joined the mandarin codes and require steady yearly totals for the rest), a catch-all code we did not spot, a shipment recorded in a different month from when it arrived, a year with an unusual shipping pattern, or a food that is sold under several codes where we looked at only one. As a check, a second script gets the same numbers from the raw file.

No machine learning was needed. The question was "which month, and how much of the year", which adding up and dividing answers directly.

Sources: UN Comtrade Database (opens in a new tab), Singapore imports by month and 6-digit Harmonized System code, downloaded 11 Oct 2026. Source: United Nations Comtrade Database.