Downloading Activities to CSV header data change

I download my activities (all road cycling) to a CSV, then import to a Excel file that I do analysis one.  I simply copy and insert the new data into the Excel file.

It worked fine up until Tuesday 11/3/24.  It appears the data is now exported with some new columns.  Also, some of the old columns have moved.  This has made the simple copy and insert not work. The issue starts after the Max Power column.

Is anyone aware of this change?  Before I reformat my old Excel file to match the new download I am hoping for a better answer.

Old Format:

Activity Type Date Favorite Title Distance Calories Time Avg HR Max HR Aerobic TE Avg Speed Max Speed Total Ascent Total Descent Avg Bike Cadence Max Bike Cadence Normalized Power® (NP®) L/R Balance Training Stress Score® Max Avg Power (20 min) Avg Power Max Power Grit Flow Total Strokes Avg. Swolf Avg Stroke Rate Total Reps Dive Time Min Temp Surface Interval Decompression Best Lap Time Number of Laps Max Temp Avg Resp Min Resp Max Resp Moving Time Elapsed Time Min Elevation Max Elevation

New Format:

Activity Type

Date Favorite Title Distance Calories Time Avg HR Max HR Aerobic TE Avg Speed Max Speed Total Ascent Total Descent Avg Bike Cadence Max Bike Cadence Normalized Power® (NP®) L/R Balance Training Stress Score® Max Avg Power (20 min) Avg Power Max Power Total Strokes Min Temp Decompression Best Lap Time Number of Laps Max Temp Avg Resp Min Resp Max Resp Moving Time Elapsed Time Min Elevation Max Elevation
  • I know this isn't the answer you're looking for, but I think part of the problem here is that the Connect CSV export only exports a limited number of activities, right? So even if you wanted to re-export *all* activities every time, you couldn't (afaik).

    There's a 3rd party site called https://www.runalyze.com which syncs with your Connect account and allows you to export *all* activity (summary data) to CSV (it only takes a few seconds for several years worth of activities, for me).

    If you're curious, this is the header for the CSV it generates (Profile > Export data > Basic data > Activities:

    id,hash,time,timezoneOffset,created,edited,isPublic,isTrack,distance,s,elapsedTime,elevationUp,elevationDown,elevationUpFile,elevationDownFile,altitudeSource,climbScore,percentageHilly,uphillEfficiency,downhillEfficiency,vam,kcal,pulseAvg,pulseMax,recoveryHr,maxHeartRateDropFrom,maxHeartRateDrop,vo2max,vo2maxByTime,vo2maxWithElevation,useVO2max,fitVO2maxEstimate,fitRecoveryTime,fitTrimp,fitHrvAnalysis,fitTrainingEffect,fitAnaerobicTrainingEffect,fitPerformanceCondition,fitPerformanceConditionEnd,fitFtp,fitSweatLoss,fitDeveloperSessionFields,rpe,subjectiveFeeling,trimp,cadence,gap,xPace,xGap,aerobicDecouplingPace,aerobicDecouplingPower,power,powerWithZero,airPower,isPowerCalculated,xPower,xPowerWithZero,wPrimeBalancePowerAvg,wPrimeBalancePowerMin,wPrimeBalancePaceAvg,wPrimeBalancePaceMin,staminaAvg,staminaMin,staminaPotentialAvg,staminaPotentialMin,zoneDistributionPace,zoneDistributionHr,zoneDistributionPower,totalStrokes,swolf,wheelSize,poolLength,strideLength,groundcontact,groundcontactBalance,verticalOscillation,verticalRatio,avgImpactGsLeft,avgImpactGsRight,avgBrakingGsLeft,avgBrakingGsRight,avgFootstrikeTypeLeft,avgFootstrikeTypeRight,avgPronationExcursionLeft,avgPronationExcursionRight,avgLegSpringStiffness,avgFormPower,avgRespiratoryRate,avgLeftRightBalance,avgLeftTorqueEffectiveness,avgRightTorqueEffectiveness,avgLeftPedalSmoothness,avgRightPedalSmoothness,avgPlatformCenterOffsetLeft,avgPlatformCenterOffsetRight,avgLeftPowerPhaseStartAngle,avgLeftPowerPhaseEndAngle,avgLeftPowerPhasePeakStartAngle,avgLeftPowerPhasePeakEndAngle,avgRightPowerPhaseStartAngle,avgRightPowerPhaseEndAngle,avgRightPowerPhasePeakStartAngle,avgRightPowerPhasePeakEndAngle,cyclingTotalGrit,cyclingTotalGrit2,cyclingAvgFlow,jumps,peakEpoc,peakEpocEstimate,temperature,windSpeed,windDeg,humidity,cloudCover,pressure,uvIndex,ozone,isNight,weatherid,weatherSource,routeName,hasTrackdata,isVirtual,splits,splitsCustom,title,partner,notes,creator,creatorDetails,deviceId,source,externalId,lock,sportid,typeid,accountid,hrv_id,original_file,hrv_avgRR,hrv_rmssd,hrv_sdsd,hrv_sdnn,hrv_sdnn5min,hrv_pnn50,hrv_pnn20,hrv_percentageAnomalies,hrv_dfaA1Avg,hrv_dfaA1Min,hrv_dfaA1Max,hrv_dfaA1PAboveAet,hrv_dfaA1PBelowAnt,hrv_dfaA1PValid,hrv_dfaA1PArtifacts,hrv_estimatedAetPower,hrv_estimatedAetPowerFeasible,hrv_estimatedAetPace,hrv_estimatedAetPaceFeasible,hrv_estimatedAetHr,hrv_estimatedAetHrFeasible,race_officialDistance,race_officialTime,race_officialAscent,race_officialDescent,race_officiallyMeasured,race_name,race_placeTotal,race_placeGender,race_placeAgeclass,race_participantsTotal,race_participantsGender,race_participantsAgeclass,race_priorityLevel,race_status,race_accountid,race_activity_id,race_race_event_id,tags,climbs,equipmentIds

  • zoepup said:
    I am hoping for a better answer.

    Not sure whether my answer meets your expectations, but I do not think that the header is fixed, at all. It seems to be wildly depending not only on the type you select - general Cycling, MTB, Indoor Cycling, Road Cycling, etc, but especially on the data in individual activities. I am getting very different headers depending on the filters I use. Some examples below. The best solution would be assigning the columns dynamically by name

    Cycling              MTB                 Road Cycling
    --------------------------------------------------------
    Activity Type Activity Type Activity Type
    Date Date Date
    Favorite Favorite Favorite
    Title Title Title
    Distance Distance Distance
    Calories Calories Calories
    Time Time Time
    Avg HR Avg HR Avg Speed
    Max HR Max HR Max Speed
    Aerobic TE Aerobic TE Training Stress Score
    Avg Speed Avg Speed Total Strokes
    Max Speed Max Speed Decompression
    Total Ascent Total Ascent Best Lap Time
    Total Descent Total Descent Number of Laps
    Avg Bike Cadence Avg GAP Moving Time
    Max Bike Cadence Training Stress Sc Elapsed Time
    Normalized Power Grit
    Training Stress Sc Flow
    Max Avg Power 20min Min Temp
    Avg Power Decompression
    Max Power Best Lap Time
    Grit Number of Laps
    Flow Max Temp
    Total Strokes Moving Time
    Min Temp Elapsed Time
    Decompression Min Elevation
    Best Lap Time Max Elevation
    Number of Laps
    Max Temp
    Moving Time
    Elapsed Time
    Min Elevation
    Max Elevation
  • Yeah I think Garmin's CSV export is not great, in general.

    Another example is the export of splits, where the format for lap time / pace isn't consistent.

    e.g. Sometimes it will return time like 4:32 (for a lap that lasted for 4 minutes and 32 seconds), but in other cases it will return time like 4:32.5. These formats aren't compatible in Excel, as the former will be (incorrectly) interpreted as 4 hours and 32 seconds (*), but the latter will be (correctly) interpreted as 4 minutes and 32.5 seconds, which means that you can't reliably do math on the CSV output without checking the data by hand and possibly fixing it yourself.

    It would be ok if this "incorrect" format was used for *all* lap times, since the math is the same whether the lap times are interpeted as hh:mm or mm:ss, assuming that no lap is 60 minutes or longer, ofc.

  • The time and decimal format is more problem of Excel which wants to be smarter than it is able to be. It is much better when using Open Calc

  • Be that as it may, Garmin should be aware that most ppl will use Excel to look at CSV files, and to make sure their output works consistently in excel.

    An easy way to do this would be to make sure all times are either in hh:mm:ss or hh:mm:ss.ss format.

    In the example above: 0:04:32 would be unambiguously interpreted as 4 minutes and 32 seconds, and it would work fine when using math with another value like either 4:21.5 or 0:04:21.5.

  • FlowState said:
    I think part of the problem here is that the Connect CSV export only exports a limited number of activities, right⁇

    Well, you can export all activities if you scroll to the very end of the Activities list before hitting the Export CSV link.

  • If that's the case, it seems that would be the solution here.

  • Btw, I just tried apache openoffice on a CSV file containing splits exported from Connect.

    If I don't enable the "detect special numbers" option, indeed it doesn't try to be smart, as you said. But in that case, the times and paces are just interpreted as strings, which means they're useless for my purposes: e.g. using functions such as AVERAGE or SUM to analyze the data.

    If I do enable the "detect special numbers" option, it works just like Excel. i.e. something like 4:30, representing a split of 4 minutes and 30 seconds, will be interpreted as hh:mm, while 4:30.5 (4 minutes and 30.5 seconds) will be correctly interpreted as mm:ss.ss. Again, this makes it impossible to do math on the splits without manually editing the times to add a leading "0:" where necessary.

    So I will reiterate my assertion that Garmin's CSV output for exported splits is inconsistent, incorrect, and not as useful as it could be.

    It would be so easy for Garmin to normalize the output so that all times and paces are formatted as either hh:mm:ss or [hh:]mm:ss.ss but they aren't aware of the problem and they probably wouldn't care either way. Rn the CSV splits are ok as human-readable output, but less than useful for manipulation via software. But the whole point of the CSV export is to manipulate the data with software, right?

    EDIT: looking at my activity history in Connect now, it looks like lap times are always displayed and exported with fractional seconds (e.g. 4:30.0), at least when they're not collapsed into intervals, so maybe this issue has been addressed after all (as mm:ss.ss is unambiguous). If so, thanks Garmin!

  • I had the same thought but I always export to CSV from the header screen   I don’t select road cycling, mtb, etc. it has always worked up until now. I realize I can s roll to end  and export everything again. It’s only 18 years of data. I

    i will try exporting after filtering only road cycling and report back. 


    f that fails it is probably easier to reorganize my old data to match the new format … until it changes again 

  • It changes whenever there is a new activity in the filtered visible results that contains data that were not previously available in the older activities. For example when using a new type of activity, new sensor, new watch or head unit, or when Garmin adds a new metrics.