Why do the dates switch and show only two or three months of data at a time in certain reports?

By default, the maximum period over which Mixpanel allows uniquing (that is, looking at the unique number of users who did a certain event instead of the total events) is either 60 or 90 days. When using certain Mixpanel out-of-the-box reports (specifically bar and pie Segmentation reports and Funnels), you will only be able to see up to 60 or 90 days of unique user data at a time in the UI. If you select more than 60 days in Segmentation or 90 days in Funnels, the date ranges will automatically be shortened.

Why?

This limit exists to prevent latency. Calculating the unique number of users from a massive number of data points is computationally intensive, and for every additional day analyzed, the computation increases exponentially. We've found that 90 days is the limit at which these computation times become unbearably slow, so for our customer's sake, we prevent poor load times.

So how do I get this data?

You have a few options if you need to look at unique users who did a certain action over a longer period:

Store it as a People Property: Depending on the question you’re trying to answer with your data, storing the information you’re looking for as a People Property could be a viable solution. For example, if you’ll always want to know at any given time, all-time, the number of unique users who have made a purchase, you could store the People Property “Has made purchase” and use an Insight report to see how many unique users all time have this property set to True.

Use JQL: If using a People Property won’t work for your use case, or if you need to look at historical data, you can use Mixpanel JQL (from your project, Applications > JQL) to look at uniques for a longer period of time. Here is an example query that would give you the number of unique users who did Event X from January 1, 2016 until June 9, 2016:

function main() {
  return Events({
    from_date: '2016-01-01',
    to_date:   '2016-06-09',
    event_selectors: [{event: "Event X"}]
  })
  .groupByUser(function(){
    return 1;
  }).reduce(mixpanel.reducer.count())
}