def extract_from_fit(file_handler): activity = Activity(file_handler) activity.parse() # Records, in an activity file that represent actual data points in your workout records = activity.get_records_by_type('session') out = [] for record in records: d = {} # get the list of valid fields on this record valid_field_names = record.get_valid_field_names() # Examine only >>> event='session' and trigger='activity_end' <<< if not ('trigger' in valid_field_names) and (record.get_data('trigger') == 'activity_end'): continue for field_name in list(set(INTERESTING_FIELD_NAMES) & set(valid_field_names)): # Get the data and units for the field field_data = record.get_data(field_name) field_units = record.get_units(field_name) if not field_units: field_units = None d[field_name] = {'data': field_data, 'units': field_units} out.append(d) return out
def main_fit_id(argv): theids=[] if os.path.isdir(argv[2]): fit_files=[os.path.join(argv[1],f) for f in os.listdir(sys.argv[1]) if f.endswith('.fit')] else: fit_files=argv[2:] for filename in fit_files: sys.stderr.write("Getting ID for .fit file: "+filename+"\n") activity = Activity(filename) # TODO: this is the really time consuming one activity.parse() session = next(activity.get_records_by_type('session')) start_time=session.get_data("start_time") theid=("%04d" % start_time.year)+("%02d" % start_time.month)+("%02d" % start_time.day)+'T'+("%02d" % start_time.hour)+("%02d" % start_time.minute)+("%02d" % start_time.second) thefilenametimestamp=os.path.getmtime(filename) theids.append((os.path.normpath(filename),theid)) for theid in theids: print theid[0] + ' ' + theid[1]
class FitParser(object): def __init__(self, path, tz_offset=None): self.path = path self.tz_offset = tz_offset self.act = Activity(path) self.act.parse() def parseFitRecord(self, r, last_sample): d = r.as_dict() try: lat = semicircles_to_radians(d['position_lat']) except KeyError: lat = last_sample.lat try: lon = semicircles_to_radians(d['position_long']) except KeyError: lon = last_sample.lon ts = time.mktime(d['timestamp'].timetuple()) if self.tz_offset is None: self.tz_offset = local_timezone_offset(ts) ts -= self.tz_offset return ActSample(ts, lat, lon, d.get('altitude', last_sample.alt), d.get('temperature', last_sample.temp), d.get('distance', last_sample.d), d.get('speed', last_sample.v), d.get('heart_rate', last_sample.hr), d.get('cadence', last_sample.cad), d.get('power', last_sample.pwr) ) def samples(self, s=ActSample.empty()): """Yield all trackpoints as ActSample objects.""" for r in self.act.get_records_by_type('record'): s = self.parseFitRecord(r, s) yield s def all(self): """Yield all .fit records as dicts.""" for d in self.act.get_records_as_dicts(): yield d
def main_fit_id(argv): theids = [] if os.path.isdir(argv[2]): fit_files = [ os.path.join(argv[1], f) for f in os.listdir(sys.argv[1]) if f.endswith('.fit') ] else: fit_files = argv[2:] for filename in fit_files: sys.stderr.write("Getting ID for .fit file: " + filename + "\n") activity = Activity(filename) # TODO: this is the really time consuming one activity.parse() session = next(activity.get_records_by_type('session')) start_time = session.get_data("start_time") theid = ("%04d" % start_time.year) + ("%02d" % start_time.month) + ( "%02d" % start_time.day) + 't' + ("%02d" % start_time.hour) + ( "%02d" % start_time.minute) + ("%02d" % start_time.second) thefilenametimestamp = os.path.getmtime(filename) theids.append((os.path.normpath(filename), theid)) for theid in theids: print theid[0] + ' ' + theid[1]
def get_records(f): filename = '%s/%s' % (fit_files_path, f) activity = Activity(filename) activity.parse() records = activity.get_records_by_type('record') return records
# crack the record.type from datetime import datetime from fitparse import Activity FileLoc = r'S:\\will\\documents\\OneDrive\\bike\\activities\\will\\' #fitfilepath = FileLoc + r'2018-06-01-11-13-49.fit' # long ride fitfilepath = FileLoc + r'2016-07-09-13-52-59.fit' # problems activity = Activity(fitfilepath) activity.parse() records = activity.records record_types = set() for record in records: record_types.add(record.type.name) fields_by_type = {} for RType in record_types: print 'type = %s' % RType records = activity.get_records_by_type(RType) RecNum = 0 fields_by_type[RType] = set() for record in records: valid_field_names = record.get_valid_field_names() #print ' name = ', for name in valid_field_names: fields_by_type[RType].add(name) # print name + ', ', # if 'balance' in name.lower(): # print 'balance found in %s field within %s record type' \ # % (name, RType) # if RType == 'record': # print '*', # else: # print '.',
def main_fit(argv): filename=sys.argv[1] activity = Activity(filename) activity.parse() session = next(activity.get_records_by_type('session')) session_dict={} start_time=local_date_to_utc(session.get_data("start_time")) real_start_time=session.get_data("start_time") session_dict['elapsed-time']=session.get_data("total_elapsed_time") timer_time=session.get_data("total_timer_time") session_dict['timer-time']=timer_time distance=session.get_data("total_distance") session_dict['distance']=distance # TODO: possibility do this for very small distances if distance == 0.0: # TODO: change to None? session_dict['pace']=0.0 else: session_dict['pace']=(1000./(distance/timer_time))/60. theid=time_to_id(start_time) session_dict['id']=theid session_dict['start-time']=theid end_time=local_date_to_utc(session.get_data("timestamp")) end_time_id=time_to_id(end_time) session_dict['end-time']=end_time_id session_dict['laps']={} session_dict['laps']['start-time']=[] session_dict['laps']['start-timestamp']=[] session_dict['laps']['end-time']=[] session_dict['laps']['end-timestamp']=[] session_dict['laps']['timer-time']=[] session_dict['laps']['distance']=[] session_dict['laps']['pace']=[] session_dict['laps']['maximum-speed']=[] session_dict['laps']['average-heart-rate']=[] session_dict['laps']['maximum-heart-rate']=[] session_dict['laps']['trigger-method']=[] session_dict['laps']['trackpoints']=[] session_dict['lap start times']=[] session_dict['lap end times']=[] session_dict['lap start distances']=[] session_dict['lap end distances']=[] for lap in activity.get_records_by_type('lap'): session_dict['laps']['start-time'].append(str(local_date_to_utc(lap.get_data("start_time")))) start_time=lap.get_data("start_time") session_dict['laps']['end-time'].append(str(local_date_to_utc(lap.get_data("timestamp")))) end_time=lap.get_data("timestamp") timer_time=lap.get_data("total_timer_time") session_dict['laps']['timer-time'].append(timer_time) distance=lap.get_data("total_distance") session_dict['laps']['distance'].append(distance) if distance == 0.0 or distance == None or timer_time == None: # TODO: change to None? session_dict['laps']['pace'].append(0.) else: session_dict['laps']['pace'].append((1000./(distance/timer_time))/60.) session_dict['laps']['maximum-speed'].append(lap.get_data("max_speed")) # opt session_dict['laps']['average-heart-rate'].append(lap.get_data("avg_heart_rate")) #opt session_dict['laps']['maximum-heart-rate'].append(lap.get_data("max_heart_rate")) #opt session_dict['laps']['trigger-method'].append(LAP_TRIGGER_MAP.get(lap.get_data("lap_trigger"), "Manual")) first_track_point=True for trackpoint in activity.get_records_by_type('record'): tts = trackpoint.get_data("timestamp") if tts >= start_time and tts <= end_time: if first_track_point==True: session_dict['lap start times'].append((trackpoint.get_data("timestamp")-real_start_time).seconds) session_dict['lap start distances'].append(trackpoint.get_data("distance")) first_track_point=False session_dict['laps']['trackpoints'].append({}) session_dict['laps']['trackpoints'][-1]['timestamp']=str(local_date_to_utc(trackpoint.get_data("timestamp"))) session_dict['laps']['trackpoints'][-1]['elapsed-time']=(trackpoint.get_data("timestamp")-real_start_time).seconds session_dict['laps']['trackpoints'][-1]['latitude-position']=trackpoint.get_data("position_lat") session_dict['laps']['trackpoints'][-1]['longitude-position']=trackpoint.get_data("position_long") session_dict['laps']['trackpoints'][-1]['distance']=trackpoint.get_data("distance") session_dict['laps']['trackpoints'][-1]['altitude']=trackpoint.get_data("altitude") session_dict['laps']['trackpoints'][-1]['speed']=trackpoint.get_data("speed") session_dict['laps']['trackpoints'][-1]['heart rate']=trackpoint.get_data("heart_rate") # TODO: make sure this works out OK, get last valid position if session_dict['laps']['trackpoints'][-1]['latitude-position'] == None: session_dict['laps']['trackpoints'][-1]['latitude']=None else: session_dict['laps']['trackpoints'][-1]['latitude']=str(semicircle_to_degrees(session_dict['laps']['trackpoints'][-1]['latitude-position'])) if session_dict['laps']['trackpoints'][-1]['longitude-position'] == None: session_dict['laps']['trackpoints'][-1]['longitude']=None else: session_dict['laps']['trackpoints'][-1]['longitude']=str(semicircle_to_degrees(session_dict['laps']['trackpoints'][-1]['longitude-position'])) # add first and last session_dict['lap end times'].append(session_dict['laps']['trackpoints'][-1]['elapsed-time']) session_dict['lap end times'].append(session_dict['laps']['trackpoints'][-1]['distance']) # update things from laps session_dict['start-latitude']=session_dict['laps']['trackpoints'][0]['latitude'] session_dict['start-longitude']=session_dict['laps']['trackpoints'][0]['longitude'] session_dict['end-latitude']=session_dict['laps']['trackpoints'][-1]['latitude'] session_dict['end-longitude']=session_dict['laps']['trackpoints'][-1]['longitude'] return session_dict
#!/usr/bin/env python # Sample usage of python-fitparse to parse an activity and # print its data records. from __future__ import print_function from fitparse import Activity import re from collections import OrderedDict activity = Activity("tests/data/sample-activity.fit") activity.parse() # Records of type 'record' (I know, confusing) are the entries in an # activity file that represent actual data points in your workout. records = activity.get_records_by_type('record') current_record_number = 0 dic =OrderedDict.fromkeys(["timestamp","position_lat","position_long","distance","altitude","speed","heart_rate","temperature"]) counter =0 for value in dic.keys(): if counter != 0: print(';',sep='',end='') print(value,sep='',end='') counter+=1 print() for record in records: # Print record number current_record_number += 1 #print (" Record #%d " % current_record_number).center(40, '-')
from datetime import datetime from fitparse import Activity #fitfilepath = r'S:\will\documents\bike\python-fitparse-master\tests\data\\' \ # + r'sample-activity.fit' fitfilepath = r'2017-01-02-16-12-43_edge.fit' activity = Activity(fitfilepath) activity.parse() # Records of type 'record' (I know, confusing) are the entries in an # activity file that represent actual data points in your workout. # types: [ 'record', 'lap', 'event', 'session', 'activity', ... ] records = activity.get_records_by_type('lap') current_record_number = 0 time_signal = [] heart_rate = [] FirstIter = True for record in records: # Print record number current_record_number += 1 print (" Record #%d " % current_record_number).center(40, '-') # Get the list of valid fields on this record valid_field_names = record.get_valid_field_names()
def main_fit(argv): filename = sys.argv[1] activity = Activity(filename) activity.parse() session = next(activity.get_records_by_type('session')) session_dict = {} start_time = local_date_to_utc(session.get_data("start_time")) real_start_time = session.get_data("start_time") session_dict['elapsed-time'] = session.get_data("total_elapsed_time") timer_time = session.get_data("total_timer_time") session_dict['timer-time'] = timer_time distance = session.get_data("total_distance") session_dict['distance'] = distance # TODO: possibility do this for very small distances if distance == 0.0: # TODO: change to None? session_dict['pace'] = 0.0 else: session_dict['pace'] = (1000. / (distance / timer_time)) / 60. theid = time_to_id(start_time) session_dict['id'] = theid session_dict['start-time'] = theid end_time = local_date_to_utc(session.get_data("timestamp")) end_time_id = time_to_id(end_time) session_dict['end-time'] = end_time_id session_dict['laps'] = {} session_dict['laps']['start-time'] = [] session_dict['laps']['start-timestamp'] = [] session_dict['laps']['end-time'] = [] session_dict['laps']['end-timestamp'] = [] session_dict['laps']['timer-time'] = [] session_dict['laps']['distance'] = [] session_dict['laps']['pace'] = [] session_dict['laps']['maximum-speed'] = [] session_dict['laps']['average-heart-rate'] = [] session_dict['laps']['maximum-heart-rate'] = [] session_dict['laps']['trigger-method'] = [] session_dict['laps']['trackpoints'] = [] session_dict['lap start times'] = [] session_dict['lap end times'] = [] session_dict['lap start distances'] = [] session_dict['lap end distances'] = [] for lap in activity.get_records_by_type('lap'): session_dict['laps']['start-time'].append( str(local_date_to_utc(lap.get_data("start_time")))) start_time = lap.get_data("start_time") session_dict['laps']['end-time'].append( str(local_date_to_utc(lap.get_data("timestamp")))) end_time = lap.get_data("timestamp") timer_time = lap.get_data("total_timer_time") session_dict['laps']['timer-time'].append(timer_time) distance = lap.get_data("total_distance") session_dict['laps']['distance'].append(distance) if distance == 0.0 or distance == None or timer_time == None: # TODO: change to None? session_dict['laps']['pace'].append(0.) else: session_dict['laps']['pace'].append( (1000. / (distance / timer_time)) / 60.) session_dict['laps']['maximum-speed'].append( lap.get_data("max_speed")) # opt session_dict['laps']['average-heart-rate'].append( lap.get_data("avg_heart_rate")) #opt session_dict['laps']['maximum-heart-rate'].append( lap.get_data("max_heart_rate")) #opt session_dict['laps']['trigger-method'].append( LAP_TRIGGER_MAP.get(lap.get_data("lap_trigger"), "Manual")) first_track_point = True for trackpoint in activity.get_records_by_type('record'): tts = trackpoint.get_data("timestamp") if tts >= start_time and tts <= end_time: if first_track_point == True: session_dict['lap start times'].append( (trackpoint.get_data("timestamp") - real_start_time).seconds) session_dict['lap start distances'].append( trackpoint.get_data("distance")) first_track_point = False session_dict['laps']['trackpoints'].append({}) session_dict['laps']['trackpoints'][-1]['timestamp'] = str( local_date_to_utc(trackpoint.get_data("timestamp"))) session_dict['laps']['trackpoints'][-1]['elapsed-time'] = ( trackpoint.get_data("timestamp") - real_start_time).seconds session_dict['laps']['trackpoints'][-1][ 'latitude-position'] = trackpoint.get_data("position_lat") session_dict['laps']['trackpoints'][-1][ 'longitude-position'] = trackpoint.get_data( "position_long") session_dict['laps']['trackpoints'][-1][ 'distance'] = trackpoint.get_data("distance") session_dict['laps']['trackpoints'][-1][ 'altitude'] = trackpoint.get_data("altitude") session_dict['laps']['trackpoints'][-1][ 'speed'] = trackpoint.get_data("speed") session_dict['laps']['trackpoints'][-1][ 'heart rate'] = trackpoint.get_data("heart_rate") # TODO: make sure this works out OK, get last valid position if session_dict['laps']['trackpoints'][-1][ 'latitude-position'] == None: session_dict['laps']['trackpoints'][-1]['latitude'] = None else: session_dict['laps']['trackpoints'][-1]['latitude'] = str( semicircle_to_degrees( session_dict['laps']['trackpoints'][-1] ['latitude-position'])) if session_dict['laps']['trackpoints'][-1][ 'longitude-position'] == None: session_dict['laps']['trackpoints'][-1]['longitude'] = None else: session_dict['laps']['trackpoints'][-1]['longitude'] = str( semicircle_to_degrees( session_dict['laps']['trackpoints'][-1] ['longitude-position'])) # add first and last session_dict['lap end times'].append( session_dict['laps']['trackpoints'][-1]['elapsed-time']) session_dict['lap end times'].append( session_dict['laps']['trackpoints'][-1]['distance']) # update things from laps session_dict['start-latitude'] = session_dict['laps']['trackpoints'][0][ 'latitude'] session_dict['start-longitude'] = session_dict['laps']['trackpoints'][0][ 'longitude'] session_dict['end-latitude'] = session_dict['laps']['trackpoints'][-1][ 'latitude'] session_dict['end-longitude'] = session_dict['laps']['trackpoints'][-1][ 'longitude'] return session_dict
#!/usr/bin/env python # Sample usage of python-fitparse to parse an activity and # print its data records. from __future__ import print_function from fitparse import Activity import re from collections import OrderedDict activity = Activity("tests/data/sample-activity.fit") activity.parse() # Records of type 'record' (I know, confusing) are the entries in an # activity file that represent actual data points in your workout. records = activity.get_records_by_type('record') current_record_number = 0 dic = OrderedDict.fromkeys([ "timestamp", "position_lat", "position_long", "distance", "altitude", "speed", "heart_rate", "temperature" ]) counter = 0 for value in dic.keys(): if counter != 0: print(';', sep='', end='') print(value, sep='', end='') counter += 1 print() for record in records: # Print record number
def get_records(f): filename = '%s/%s' % (fit_files_path, f) activity = Activity(filename) activity.parse() records = activity.get_records_by_type('record') return records