Displaying a chronologically-sorted life list

I may be missing something trivial, but is there a way to display on the iNat website:

  • my life list [1] sorted chronologically from the most recent to the oldest taxon observed, with the date and location where I first observed it? (similar to a life list in Merlin or eBird)
  • the same chronological life list but filtered by parent taxon and location (for example, I want to display a chronologically sorted list of all Lepidoptera I’ve seen in California, with the most recent additions at the top)

Edited:
[1] A life list is a record of all species observed by an individual, typically associated with the date and location of the first observation. It is a well established concept in the birding community but it’s used in other naturalist communities as well (including herpers, butterfly and moth watchers, botanists, mammal watchers, fishermen and fishwatchers, fungi foragers) https://en.wikipedia.org/wiki/Life_list

2 Likes

I don’t think there is a way to do this in iNaturalist. The closest is https://www.inaturalist.org/lists/radrat, which doesn’t have a temporal sort function. You would need to export the data and filter it yourself to find what you like, but that’s not on the iNaturalist website.

Would be happy to be corrected on this…

2 Likes

Thanks, Richard. I searched the functionality in the dynamics lifelist indeed and couldn’t find anything obvious. If no such a thing exists, I’ll file a feature request.

If there is one @pisum may know of it.

you’d have to do this yourself, probably. if you’re working at the species level, not having to deal with nested taxonomy like leaves or subspecies, then here’s one way to do it:

  1. download a CSV of your observations that are at least down to the species level. make sure you include the taxon_species_name field so that you can easily get the species of observations at subspecies level.
  2. import the CSV into Excel
  3. in Excel, make a PivotTable of the data, with species name in the vertical axis and min(observation date) for each species name.
  4. sort the results by min(observation date) descending (or something like that…)

if you don’t have Excel, it’s still the same general process with whatever tool(s) you have:

  1. get observations at a standardized species level
  2. get the min(observation date) for each species
  3. sort by min(observation date) desc
2 Likes

I’ve been thinking about adding this sorting to my tools, but it could be very expensive, especially if there are many species with large obs counts. Some heuristics should be added to optimize requests count.

Something like:
Get all species, filter species with small counts (like <10 obs per species). Next fetch observations, and every round add species with larger counts to without_taxon_ids param and set d1. But there will be problem with GET overflow of without_taxon_ids, so they should be regullary reseted.

May be I’ll implement this feature once.

1 Like

Thanks @pisum. I’m aware I can download and analyze my entire observation history metadata but I’m looking for a feature I could use in the website or in the app.

i suspect it would be simpler to code and more efficient to filter by taxon_id (and modify the taxa you filter for each iteration, up to 200 taxa per iteration), not by without_taxon_ids.

well, it doesn’t exist. so if you want such a list, you need to make it yourself or convince someone else to make something to do this.

1 Like

I’m not sure. For example if there are some species with very large amount of observations, it is possible to overflow your step by several species and lost other. So you have to make some more logic to filter observations and refill the taxon_ids list. May be it is good to make several different approaches depends on obs count of taxons, but it needs to be investigated anyway.

the logic would be something like:

  1. get your list of taxa taxon_list from GET /observations/species_counts?order=asc
  2. initialize a variable counter=0 to keep your place as you iterate through the taxon_list
  3. initialize an empty array fiilter_taxa to hold up to 200 taxa to filter
  4. loop while counter < len(taxon_list) or len(filter_taxa) > 0:
    a. add up to 200 - len(filter_taxa) taxa to filter_taxa from taxon_list starting from position counter, and increment counter by 1 for each taxon added.
    b. get up to 200 observations from GET /observations?taxon_id=filter_taxa&per_page=200&order_by=observed_on&order=asc
    c. for each obs from observations, if the taxon_id on this obs exists in filter_taxa: (1) get observation date and other fields of interest from obs, (2) add your fields of interest to the record in taxon_list, (3) remove the taxon_id from filter_taxa

anyone know why identifications incl. recent_taxa wouldn’t have an option to search by observer user ID?

  1. can you even filter by observer?
  2. it’s based on identification date, not observed date.
  3. it does strange things when there are a lot of observations (it’s not always getting the first recorded. sometimes it gets the first recorded in a while.)
  4. related to #1, you get problems when there are taxon changes.
  5. etc…

EDIT – i’m rereading the question, and i didn’t answer it at all. the right answer is that only the developers will know. probably they’re not storing observer on the identification, and it’s relatively expensive to add it to the index(es) needed for query purposes.

my original answer is more of an answer to why recent_taxa still wouldn’t address the original request on this topic.

What do you mean by “life list”? Do you mean a view similar to your Dynamic Life List, but sorted chronologically instead of taxonomically? Or do you mean something like the “List” view on your “My Observations” tab, but with only observations identified to the species level?

1 Like

A life list is a record of all species observed by an individual, typically associated with the date and location of the first observation. It is a well established concept in the birding community but it’s used in other naturalist communities as well (e.g. someone will say they found a “lifer” butterfly after observing a species for the first time)

https://en.wikipedia.org/wiki/Life_list

It could be implemented in the Dynamic Life List as long as there was a way of sorting taxa by date and time of their first observation.

Yes, you was right. taxon_id is better approach, produce less API calls and has less logic.

Fetch all taxon leafs for the user to the list.
Take first 200-500 taxa of the list and get observations for them.
Add first obs date for each taxon and move it from all taxa to updated list.
Repeat until the list is not empty.

@radrat, here your list (only with first observation date, without location).
And here is your second variant, “Lepidoptera in California”.

It was a nice brain exercise, thank you all)

2 Likes

I know what a life list means. I was asking what view you were looking for because I could think of two possibilities within iNaturalist functionality. If I go to my “Your Observations” tab, choose the “List” view, and filter for “High=Species/Hybrid” I get something that looks like a chronological life list:


I could also filter for “Sort by: Ascending” if I wanted the oldest ones on top.

1 Like

I know what a life list means

My apologies, I was unsure what you were asking.

I get something that looks like a chronological life list:

Not quite. That’s a list of all my observations chronologically sorted. I’d expect a life list to include only my first/oldest observation of a given species (and the corresponding date and location), in other words a single row per species. As an example, this is a snippet of what my lifelist looks like in eBird:

Importantly, a life list can also be sorted taxonomically (see below), but each record still represents only the first observation of the species

Other platforms like Herpmapper, MammalWatching, MushroomObserver all implement similar life lists.

1 Like

That’s excellent, nicely done. I just noticed a small glitch you may want to look into. Species #2629 according to your list (Western Whiptail) was first observed on 5/10/25.

  1. Western Whiptail Aspidoscelis tigris , 2 observations, 5/10/25

If you click the link you’ll see my first observation is actually from 2022 but given that it was later IDed at the subspecies level it is not included. Is there some parameter I can use to fix that?

This is exactly what I wish iNat implemented natively on the site as an extension of the dynamic life list.

Is there some parameter I can use to fix that?

I’m not sure, because it is the way inat works with subspecies.
You can uncheck “Display only species” and add hrank=species to “Additional parameters” field, but the script fall into infinite loop and throws an error because of subspecies.
I have to fix it and recheck.

1 Like

when you’re getting observations, you don’t need to filter by rank, lrank, or hrank, unless your species_count results were filtered the same way. your species_count list should already be leaf taxa. so doing additional rank filtering when getting observations is going to cause problems.

you probably should also get the max number of observations (200) when you get observations. also, i think it would be more efficient to get observations by first filtering for taxa with the lowest observation counts, then adding taxa with increasing observation counts as you continue.