Rename subkeys of nested dictionary dynamically
Clarity probably trumps speed, but then again, it's not quite clear
why you need this format and what is further going to happen to that
dictionary.

You can definitely get rid of the innermost loop by computing the
replacement index on the fly instead of testing all possibilities:

from collections import OrderedDict

year = int("1996") # comes as string
lag_length = 2
replacement = ["lag%s_fte_count" % (i - 1) for i in range(lag_length, 0, -1)]

for ID, value in my_dict.iteritems():
    for subkey in value.keys():
        year_string = subkey[:4]

        if not year_string.isdigit():
            continue

        parsed_year = int(year_string)

        if not year - lag_length &lt;= parsed_year &lt; year:
            continue

        value[replacement[lag_length + parsed_year - year]] = value.pop(subkey)


I also used iteritems to get both values at the same time; for
value.keys() that's sadly not possible while iterating.  The year
input should also be parsed immediately as it'll always be used in the
integer form.

Next I'm assuming the keys start with the four-character year, so then
the year can be parsed and compared with the target range and if it's in
the range, the key is renamed by calculating the correct index.

Furthermore you could remove the isdigit call if the format allows for
it and replacement could be removed by always generating the string
immediately, e.g. like this:

value["lag%s_fte_count" % (year - parsed_year - 1)] = value.pop(subkey)