Skip to content

Instantly share code, notes, and snippets.

@storborg
Created August 8, 2010 04:08
Show Gist options
  • Select an option

  • Save storborg/513576 to your computer and use it in GitHub Desktop.

Select an option

Save storborg/513576 to your computer and use it in GitHub Desktop.
"""
Plot climb rate (in vertical ft/min) against grade. Break it up in 10-point
chunks?
"""
from datetime import datetime
from xml.dom.minidom import parse
def grouper(n, iterable):
"""
Return elements from iterable n items at a time.
e.g. grouper(3,[1,2,3,4,5,6,7]) -> ([1,2,3], [4,5,6], [7])
"""
iterable = iter(iterable)
ret = []
for item in iterable:
ret.append(item)
if len(ret) >= n:
yield ret
ret = []
if len(ret) > 0:
yield ret
def grab(el, field):
return el.getElementsByTagName(field)[0].childNodes[0].data
def parse():
root = parse('Geneva-Nice Profile.tcx')
def parse_trackpoint(el):
time_str = grab(el, 'Time')
print "time_str is %r" % time_str
time = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%SZ")
dist = float(grab(el, 'DistanceMeters'))
alt = float(grab(el, 'AltitudeMeters'))
return (time, dist, alt)
def parse_activity(el):
rates = []
first = None
for points in grouper(10, el.getElementsByTagName('Trackpoint')):
last = parse_trackpoint(points[-1])
if first:
dist = last[1] - first[1]
# grade in %
if dist > 0:
grade = 100. * ((last[2] - first[2]) / dist)
td = last[0] - first[0]
time_secs = td.seconds + (td.days * 24 * 3600)
if time_secs > 0:
# meters / second
climb_rate = (last[2] - first[2]) / time_secs
# ft / hour
climb_rate = (climb_rate * 3.3 * 60 * 60)
print "initial time is %r" % first[0]
print "final time is %r" % last[0]
print "time_secs is %0.2f" % time_secs
print "altitude diff is %f" % (last[2] - first[2])
print "climb_rate is %f" % climb_rate
rates.append((climb_rate, grade))
first = last
return rates
# Need to sort these by Id.
climb_rates = []
for activity in root.getElementsByTagName('Activity'):
climb_rates.extend(parse_activity(activity))
return climb_rates
if __name__ == '__main__':
data = [(rate, grade) for rate, grade in parse()
if 0 < grade < 20)]
with open('out.csv', 'w') as f:
for rate, grade in data:
f.write('%f,%f\n' % (grade, rate))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment