In [1]:
%load_ext load_style
%load_style talk.css

Pandas

In [2]:
import addutils.toc ; addutils.toc.js(ipy_notebook=True)
Out[2]:
In [3]:
from IPython.display import Image, HTML

pandas is a Python package providing fast, flexible, and expressive data structures designed to work with relational or labeled data. It is a fundamental high-level building block for doing practical, real world data analysis in Python.

pandas is well suited for:

  • Tabular data with heterogeneously-typed columns, as in an SQL table or Excel spreadsheet
  • Ordered and unordered (not necessarily fixed-frequency) time series data.
  • Arbitrary matrix data (homogeneously typed or heterogeneous) with row and column labels
  • Any other form of observational / statistical data sets. The data actually need not be labeled at all to be placed into a pandas data structure

Key features:

  • Easy handling of missing data
  • Size mutability: columns can be inserted and deleted from DataFrame and higher dimensional objects
  • Automatic and explicit data alignment: objects can be explicitly aligned to a set of labels, or the data can be aligned automatically
  • Powerful, flexible group by functionality to perform split-apply-combine operations on data sets
  • Intelligent label-based slicing, fancy indexing, and subsetting of large data sets
  • Intuitive merging and joining data sets
  • Flexible reshaping and pivoting of data sets
  • Hierarchical labeling of axes
  • Robust IO tools for loading data from flat files, Excel files, databases, and HDF5
  • Time series functionality: date range generation and frequency conversion, moving window statistics, moving window linear regressions, date shifting and lagging, etc.
In [4]:
HTML('<iframe src=http://pandas.pydata.org/index.html width=900 height=350></iframe>')
Out[4]:

The conventional way to import pandas is:

import pandas as pd
In [5]:
import pandas as pd
In [6]:
print(pd.__version__)
0.18.0
In [7]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

some options setting

In [8]:
pd.set_option("display.width", 80)
# toggle the line below that if one doesnt want DataFrames displayed as HTML tables
#pd.set_option("notebook_repr_html", False) 
pd.set_option("notebook_repr_html", True) 

Pandas's data structures and functionalities will be familiar to R users, there's a section on Pandas's website where Wes McKinney gives some translation of common idioms / operations between R and Pandas

In [9]:
HTML('<iframe src=http://pandas.pydata.org/pandas-docs/stable/comparison_with_r.html#compare-with-r width=900 height=350></iframe>')
Out[9]:

Pandas data structures

Series

A Series is a single vector of data values (think a NumPy array with shape N or (N,1)) with an index that labels each element in the vector.

Series constructions

In [10]:
a = pd.Series(np.random.normal(0,1,(10,)))
In [11]:
a
Out[11]:
0    0.486454
1   -0.730349
2    2.142218
3    0.858479
4    0.613529
5    0.410073
6    0.244305
7    1.010814
8    0.372422
9   -1.348384
dtype: float64
In [12]:
a.index
Out[12]:
RangeIndex(start=0, stop=10, step=1)
In [13]:
a.values
Out[13]:
array([ 0.4864535 , -0.73034884,  2.14221846,  0.85847929,  0.61352902,
        0.41007344,  0.24430496,  1.01081354,  0.37242184, -1.34838402])

You can define your own index

In [14]:
a = pd.Series(np.random.normal(0,1,(10,)), index=np.arange(1,11))
In [15]:
a
Out[15]:
1    -0.547611
2     0.237740
3     1.174041
4    -0.277616
5    -0.891984
6     2.068516
7    -0.886925
8    -1.424593
9    -0.704715
10   -0.469257
dtype: float64
In [16]:
a = pd.Series(np.random.normal(0,1,5), \
              index=['a','b','c','d','e'], name='my series')
In [17]:
a
Out[17]:
a   -0.774220
b    0.124874
c    1.103268
d    0.458087
e    0.918273
Name: my series, dtype: float64

Pandas objects expose some powerful, high level plotting functions (built on top of Matplotlib)

In [18]:
plot = a.plot(kind='bar', rot=0, color='r', title=a.name, width=0.9)

same plot in matplotlib

In [19]:
f, ax = plt.subplots()
bars = ax.bar(np.arange(len(a)), a.values, color='r', align='center', width=0.9)
ax.set_xticks(np.arange(len(a)))
ax.set_xlim(-0.5, len(a)-0.5)
ax.set_xticklabels(a.index)
ax.set_title(a.name)
ax.grid()

Series indexing

Selecting from a Series is easy, using the corresponding index key (like a dict)

In [20]:
a
Out[20]:
a   -0.774220
b    0.124874
c    1.103268
d    0.458087
e    0.918273
Name: my series, dtype: float64
In [21]:
a['c']
Out[21]:
1.103267746110159

slices are permitted

In [22]:
a['a':'c'] ### Note the difference with standard Python / Numpy positional, integer indexing
Out[22]:
a   -0.774220
b    0.124874
c    1.103268
Name: my series, dtype: float64
In [23]:
a['c':]
Out[23]:
c    1.103268
d    0.458087
e    0.918273
Name: my series, dtype: float64

deleting an element

In [24]:
a.drop('d')
Out[24]:
a   -0.774220
b    0.124874
c    1.103268
e    0.918273
Name: my series, dtype: float64

Adding an element is (to my knowledge) not straightforward

In [25]:
a.drop('a', inplace=True)
In [26]:
a
Out[26]:
b    0.124874
c    1.103268
d    0.458087
e    0.918273
Name: my series, dtype: float64
In [27]:
a.append(pd.Series({'a':5}))
Out[27]:
b    0.124874
c    1.103268
d    0.458087
e    0.918273
a    5.000000
dtype: float64
In [28]:
a
Out[28]:
b    0.124874
c    1.103268
d    0.458087
e    0.918273
Name: my series, dtype: float64

Mathematical operations involving two series will perform operations by aligning indices.

  1. The union of all indices is created
  2. The mathematical operation is performed on matching indices.

Indices that do not match are given the value NaN (not a number), and values are computed for all unique pairs of repeated indices.

In [29]:
s1 = pd.Series(np.arange(1.0,4.0),index=['a','b','c'])
s2 = pd.Series(np.arange(1.0,4.0),index=['b','c','d'])
In [30]:
s3 = s1 + s2
In [31]:
s3
Out[31]:
a    NaN
b    3.0
c    5.0
d    NaN
dtype: float64

NaNs are ignored in all operations

In [32]:
s3.mean()
Out[32]:
4.0

You can drop them from the Series

In [33]:
s4 = s3.dropna()
In [34]:
s4
Out[34]:
b    3.0
c    5.0
dtype: float64

Or use the fillna method to replace them by a value

In [35]:
s3.fillna(-999)
Out[35]:
a   -999.0
b      3.0
c      5.0
d   -999.0
dtype: float64
In [36]:
s3.fillna(s3.mean())
Out[36]:
a    4.0
b    3.0
c    5.0
d    4.0
dtype: float64

Series with a date / datetime index (timeseries)

Series can have indexes representing dates / times

In [37]:
a
Out[37]:
b    0.124874
c    1.103268
d    0.458087
e    0.918273
Name: my series, dtype: float64
In [38]:
a.index = pd.date_range(start='2014-1-1', periods=len(a)) # default 'period' is daily
In [39]:
a.head()
Out[39]:
2014-01-01    0.124874
2014-01-02    1.103268
2014-01-03    0.458087
2014-01-04    0.918273
Freq: D, Name: my series, dtype: float64
In [40]:
a.index
Out[40]:
DatetimeIndex(['2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04'], dtype='datetime64[ns]', freq='D')
In [41]:
### but you can convert it to an numpy array of python datetime objects if you want
py_datetimes = a.index.to_pydatetime()
In [42]:
py_datetimes
Out[42]:
array([datetime.datetime(2014, 1, 1, 0, 0),
       datetime.datetime(2014, 1, 2, 0, 0),
       datetime.datetime(2014, 1, 3, 0, 0),
       datetime.datetime(2014, 1, 4, 0, 0)], dtype=object)

And a number of useful methods for manipulation of time series is exposed

In [48]:
### resample daily time-series to 1 hour 'period', using forward filling method
a.resample('1h').ffill().head()
Out[48]:
2014-01-01 00:00:00    0.124874
2014-01-01 01:00:00    0.124874
2014-01-01 02:00:00    0.124874
2014-01-01 03:00:00    0.124874
2014-01-01 04:00:00    0.124874
Freq: H, Name: my series, dtype: float64
In [49]:
a
Out[49]:
2014-01-01    0.124874
2014-01-02    1.103268
2014-01-03    0.458087
2014-01-04    0.918273
Freq: D, Name: my series, dtype: float64
In [50]:
### the ```shift``` method makes it easy e.g. to compare series with lead / lags 
a.shift(periods=-1)
Out[50]:
2014-01-01    1.103268
2014-01-02    0.458087
2014-01-03    0.918273
2014-01-04         NaN
Freq: D, Name: my series, dtype: float64
In [51]:
a
Out[51]:
2014-01-01    0.124874
2014-01-02    1.103268
2014-01-03    0.458087
2014-01-04    0.918273
Freq: D, Name: my series, dtype: float64
In [52]:
### and the ```truncate`` method allows easy selection of time-slices
a.truncate(after='2014-1-2')
Out[52]:
2014-01-01    0.124874
2014-01-02    1.103268
Freq: D, Name: my series, dtype: float64

DataFrames

DataFrames are IMHO one of the most powerful data structures in the Python / data analysis world.

They can be viewed as a collection of named Series. They feature two indexes, respectively for the rows and the columns, and can contain heteregoneous data types (although it must be consistent within each column). Note that a DataFrame index, either along the rows or the columns (or both !) can contain more than one level, they are called hierarchical indexes and allows the representation of complex data organisation.

If the index along the rows of a DataFrame is of datetime type, all the methods exposed for the Series (re-sampling, shifting, truncating, etc) are available for the DataFrame.

DataFrame constructions

In [54]:
import string # part of the standard library
idx = list(string.ascii_lowercase[0:10])
print(idx)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
In [55]:
df = pd.DataFrame(np.arange(100).reshape(10,10),\
                  columns=idx,index=np.arange(1,11))
In [56]:
df
Out[56]:
a b c d e f g h i j
1 0 1 2 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 17 18 19
3 20 21 22 23 24 25 26 27 28 29
4 30 31 32 33 34 35 36 37 38 39
5 40 41 42 43 44 45 46 47 48 49
6 50 51 52 53 54 55 56 57 58 59
7 60 61 62 63 64 65 66 67 68 69
8 70 71 72 73 74 75 76 77 78 79
9 80 81 82 83 84 85 86 87 88 89
10 90 91 92 93 94 95 96 97 98 99
In [61]:
### here I am creating a DataFrame from a dictionnary

df = pd.DataFrame({'a' : np.random.random(5),\
                   'b' : np.random.random(5),\
                   'c': np.random.random(5)}, index=np.arange(1,6))
In [62]:
df
Out[62]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264

Indexing a DataFrame

different ways, return either a Series or a DataFrame

In [63]:
df[['a']]
Out[63]:
a
1 0.653164
2 0.962469
3 0.028905
4 0.038971
5 0.111465
In [64]:
type(df['a']) 
Out[64]:
pandas.core.series.Series
In [65]:
df[['a']]
Out[65]:
a
1 0.653164
2 0.962469
3 0.028905
4 0.038971
5 0.111465
In [66]:
type(df['a'])
Out[66]:
pandas.core.series.Series

To access a particular row instead of a column, you use the ix method

In [67]:
df
Out[67]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264
In [68]:
df.ix[3]
Out[68]:
a    0.028905
b    0.333779
c    0.613020
Name: 3, dtype: float64
In [69]:
df
Out[69]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264

access values per positional indices only

In [70]:
df.iloc[2,0:2]
Out[70]:
a    0.028905
b    0.333779
Name: 3, dtype: float64
In [71]:
type(_)
Out[71]:
pandas.core.series.Series

And you can combine of course row (with ix) and column indexing, using the same convention for slices as we saw for the Series

In [72]:
df.ix[3]['a':'b']
Out[72]:
a    0.028905
b    0.333779
Name: 3, dtype: float64
In [73]:
df.ix[3:5][['a','c']]
Out[73]:
a c
3 0.028905 0.613020
4 0.038971 0.163867
5 0.111465 0.520264

you can also use the loc method, giving it both row AND columns indexes (the indexing is based on the label, NOT on the position)

In [74]:
df
Out[74]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264
In [75]:
df.loc[[3,5],['a','b']]
Out[75]:
a b
3 0.028905 0.333779
5 0.111465 0.813810

conditional indexing or subsetting of a DataFrame

In [76]:
df
Out[76]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264
In [77]:
df
Out[77]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264
In [78]:
subset = df[df['a'] <= 0.4]
In [79]:
subset
Out[79]:
a b c
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264

queries

as from Pandas version 0.14, you can build complex database-like queries on DataFrames

In [80]:
df
Out[80]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264
In [81]:
df.query('a > b')
Out[81]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
In [82]:
df.query('(a > b) & (b > c)')
Out[82]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913

Extending a DataFrame

Adding a column is easy

In [83]:
df
Out[83]:
a b c
1 0.653164 0.412884 0.152349
2 0.962469 0.849935 0.230913
3 0.028905 0.333779 0.613020
4 0.038971 0.512849 0.163867
5 0.111465 0.813810 0.520264
In [84]:
df['d'] = np.random.random(5)
In [85]:
df
Out[85]:
a b c d
1 0.653164 0.412884 0.152349 0.426597
2 0.962469 0.849935 0.230913 0.246311
3 0.028905 0.333779 0.613020 0.581089
4 0.038971 0.512849 0.163867 0.508902
5 0.111465 0.813810 0.520264 0.908871

The following works because Pandas understands that a single value must be repeated over the row length

In [86]:
df['e'] = 5
In [87]:
df
Out[87]:
a b c d e
1 0.653164 0.412884 0.152349 0.426597 5
2 0.962469 0.849935 0.230913 0.246311 5
3 0.028905 0.333779 0.613020 0.581089 5
4 0.038971 0.512849 0.163867 0.508902 5
5 0.111465 0.813810 0.520264 0.908871 5

The following doesn't work because there's no way to tell where to insert the missing value (align to 1st or last index ?)

In [88]:
df['f'] = np.random.random(4)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-88-840e6680bd18> in <module>()
----> 1 df['f'] = np.random.random(4)

/Users/nicolasf/anaconda/anaconda/lib/python3.5/site-packages/pandas/core/frame.py in __setitem__(self, key, value)
   2346         else:
   2347             # set column
-> 2348             self._set_item(key, value)
   2349 
   2350     def _setitem_slice(self, key, value):

/Users/nicolasf/anaconda/anaconda/lib/python3.5/site-packages/pandas/core/frame.py in _set_item(self, key, value)
   2412 
   2413         self._ensure_valid_index(value)
-> 2414         value = self._sanitize_column(key, value)
   2415         NDFrame._set_item(self, key, value)
   2416 

/Users/nicolasf/anaconda/anaconda/lib/python3.5/site-packages/pandas/core/frame.py in _sanitize_column(self, key, value)
   2570 
   2571             # turn me into an ndarray
-> 2572             value = _sanitize_index(value, self.index, copy=False)
   2573             if not isinstance(value, (np.ndarray, Index)):
   2574                 if isinstance(value, list) and len(value) > 0:

/Users/nicolasf/anaconda/anaconda/lib/python3.5/site-packages/pandas/core/series.py in _sanitize_index(data, index, copy)
   2819 
   2820     if len(data) != len(index):
-> 2821         raise ValueError('Length of values does not match length of ' 'index')
   2822 
   2823     if isinstance(data, PeriodIndex):

ValueError: Length of values does not match length of index

Unless we make a series out of it, with a index matching at least partly the DataFrame (row) index

In [89]:
df['f'] = pd.Series(np.random.random(4), index=np.arange(1,5)) #
In [90]:
df
Out[90]:
a b c d e f
1 0.653164 0.412884 0.152349 0.426597 5 0.688023
2 0.962469 0.849935 0.230913 0.246311 5 0.015322
3 0.028905 0.333779 0.613020 0.581089 5 0.012792
4 0.038971 0.512849 0.163867 0.508902 5 0.049240
5 0.111465 0.813810 0.520264 0.908871 5 NaN

Useful DataFrames methods

applying a numpy function
In [91]:
df.apply(np.sqrt) # or np.sqrt(df)
Out[91]:
a b c d e f
1 0.808185 0.642560 0.390319 0.653144 2.236068 0.829472
2 0.981055 0.921919 0.480534 0.496297 2.236068 0.123783
3 0.170014 0.577736 0.782956 0.762292 2.236068 0.113101
4 0.197410 0.716135 0.404804 0.713374 2.236068 0.221900
5 0.333863 0.902114 0.721293 0.953347 2.236068 NaN
summarizing data
In [92]:
df.describe()
Out[92]:
a b c d e f
count 5.000000 5.000000 5.000000 5.000000 5.0 4.000000
mean 0.358994 0.584651 0.336082 0.534354 5.0 0.191344
std 0.425253 0.234780 0.215113 0.243760 0.0 0.331536
min 0.028905 0.333779 0.152349 0.246311 5.0 0.012792
25% 0.038971 0.412884 0.163867 0.426597 5.0 0.014690
50% 0.111465 0.512849 0.230913 0.508902 5.0 0.032281
75% 0.653164 0.813810 0.520264 0.581089 5.0 0.208936
max 0.962469 0.849935 0.613020 0.908871 5.0 0.688023
replacing values
In [93]:
df.head()
Out[93]:
a b c d e f
1 0.653164 0.412884 0.152349 0.426597 5 0.688023
2 0.962469 0.849935 0.230913 0.246311 5 0.015322
3 0.028905 0.333779 0.613020 0.581089 5 0.012792
4 0.038971 0.512849 0.163867 0.508902 5 0.049240
5 0.111465 0.813810 0.520264 0.908871 5 NaN
In [94]:
df['e'].replace(5, 0.0, inplace=True) 
# you can use dictionnary to multiple replacements
assign

Note: assign is a DataFrame method available in version 0.16 of Pandas, to update:

ᐅ conda update pandas
In [95]:
df.assign(f = df['a'] + df['e'])
Out[95]:
a b c d e f
1 0.653164 0.412884 0.152349 0.426597 0 0.653164
2 0.962469 0.849935 0.230913 0.246311 0 0.962469
3 0.028905 0.333779 0.613020 0.581089 0 0.028905
4 0.038971 0.512849 0.163867 0.508902 0 0.038971
5 0.111465 0.813810 0.520264 0.908871 0 0.111465

that allows you to write very succint code

In [96]:
df.query('a > 0.6').assign(f = df['a'] + df['e'])
Out[96]:
a b c d e f
1 0.653164 0.412884 0.152349 0.426597 0 0.653164
2 0.962469 0.849935 0.230913 0.246311 0 0.962469

DataFrame high-level plotting functions

In [97]:
df.plot(subplots=True, figsize=(10,10));
In [98]:
df.drop('e', axis=1).plot(figsize=(8,12), \
                          subplots=True, \
                          sharex=True, \
                          kind='bar', rot=0); 
In [99]:
import pandas as pd
from sklearn.datasets import load_iris
 
    
iris = load_iris()
 
iris = pd.DataFrame(iris.data, columns=iris.feature_names)
In [100]:
iris.head()
Out[100]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
In [101]:
iris.hist(); 
In [102]:
from pandas.tools.plotting import scatter_matrix
In [103]:
scatter_matrix(iris, alpha=0.4, figsize=(10, 10), diagonal='kde'); 
In [104]:
HTML('<iframe src=http://pandas.pydata.org/pandas-docs/stable/visualization.html width=800 height=350></iframe>')
Out[104]:

Input and Output in pandas

Pandas has very powerful IO methods, allowing to load csv, excel, tab-delimited files very easily. Pandas DataFrames can also be saved also in csv, excel files.

Other supported file types are:

  • JSON (JavaScript Object Notation)
  • HDF5
  • HTML (to e.g. read tables contained in HTML documents)
  • SQL (Pandas can query directly from SQL databases thanks to SQLAlchemy)
  • ...
In [105]:
pd.read_sql_table?
In [106]:
SOI = pd.read_csv('../data/NIWA_SOI.csv')
In [107]:
!open ../data/NIWA_SOI.csv
In [108]:
SOI.head()
Out[108]:
Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
0 1876 1.1 1.0 0.1 1.0 0.8 1.8 -0.5 1.3 1.0 -0.8 -0.3 -0.4
1 1877 -0.9 -0.6 -0.4 -0.7 0.5 -1.6 -1.0 -0.8 -1.8 -1.5 -1.3 -1.4
2 1878 -0.8 -1.9 -1.5 -0.7 0.3 -0.2 1.7 1.3 1.7 1.1 1.4 1.7
3 1879 1.3 1.3 1.3 1.2 0.3 1.7 2.3 2.3 1.8 1.5 0.9 -0.6
4 1880 1.1 0.7 1.4 0.6 1.3 1.0 0.2 1.5 0.7 0.5 0.6 -0.3
In [109]:
SOI = pd.read_csv('../data/NIWA_SOI.csv', index_col=0)
In [110]:
SOI.head()
Out[110]:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Year
1876 1.1 1.0 0.1 1.0 0.8 1.8 -0.5 1.3 1.0 -0.8 -0.3 -0.4
1877 -0.9 -0.6 -0.4 -0.7 0.5 -1.6 -1.0 -0.8 -1.8 -1.5 -1.3 -1.4
1878 -0.8 -1.9 -1.5 -0.7 0.3 -0.2 1.7 1.3 1.7 1.1 1.4 1.7
1879 1.3 1.3 1.3 1.2 0.3 1.7 2.3 2.3 1.8 1.5 0.9 -0.6
1880 1.1 0.7 1.4 0.6 1.3 1.0 0.2 1.5 0.7 0.5 0.6 -0.3
In [111]:
SOI.index
Out[111]:
Int64Index([1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885,
            ...
            2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015],
           dtype='int64', name='Year', length=140)
In [112]:
SOI.ix[1950:2000].head()
Out[112]:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Year
1950 0.5 1.6 1.8 1.6 0.9 2.8 2.2 1.3 0.6 1.7 1.1 2.2
1951 1.7 0.8 -0.1 0.0 -0.5 0.6 -0.8 -0.0 -0.7 -0.8 -0.4 -0.4
1952 -0.9 -0.7 0.1 -0.7 0.7 0.8 0.4 -0.3 -0.4 0.2 -0.1 -1.4
1953 0.2 -0.6 -0.5 0.1 -3.0 -0.1 -0.1 -1.7 -1.3 -0.0 -0.3 -0.5
1954 0.6 -0.3 -0.0 0.7 0.6 -0.1 0.5 1.1 0.4 0.2 0.3 1.2

Stacking

In [113]:
SOIs = SOI.stack()
In [114]:
SOIs.index
Out[114]:
MultiIndex(levels=[[1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015], ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2]],
           names=['Year', None])
In [115]:
SOIs.index
Out[115]:
MultiIndex(levels=[[1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015], ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2]],
           names=['Year', None])
In [116]:
from dateutil import parser
In [117]:
dateindex = [parser.parse("-".join(map(str, [x[0], x[1], 1]))) for x in SOIs.index]
In [118]:
dateindex
Out[118]:
[datetime.datetime(1876, 1, 1, 0, 0),
 datetime.datetime(1876, 2, 1, 0, 0),
 datetime.datetime(1876, 3, 1, 0, 0),
 datetime.datetime(1876, 4, 1, 0, 0),
 datetime.datetime(1876, 5, 1, 0, 0),
 datetime.datetime(1876, 6, 1, 0, 0),
 datetime.datetime(1876, 7, 1, 0, 0),
 datetime.datetime(1876, 8, 1, 0, 0),
 datetime.datetime(1876, 9, 1, 0, 0),
 datetime.datetime(1876, 10, 1, 0, 0),
 datetime.datetime(1876, 11, 1, 0, 0),
 datetime.datetime(1876, 12, 1, 0, 0),
 datetime.datetime(1877, 1, 1, 0, 0),
 datetime.datetime(1877, 2, 1, 0, 0),
 datetime.datetime(1877, 3, 1, 0, 0),
 datetime.datetime(1877, 4, 1, 0, 0),
 datetime.datetime(1877, 5, 1, 0, 0),
 datetime.datetime(1877, 6, 1, 0, 0),
 datetime.datetime(1877, 7, 1, 0, 0),
 datetime.datetime(1877, 8, 1, 0, 0),
 datetime.datetime(1877, 9, 1, 0, 0),
 datetime.datetime(1877, 10, 1, 0, 0),
 datetime.datetime(1877, 11, 1, 0, 0),
 datetime.datetime(1877, 12, 1, 0, 0),
 datetime.datetime(1878, 1, 1, 0, 0),
 datetime.datetime(1878, 2, 1, 0, 0),
 datetime.datetime(1878, 3, 1, 0, 0),
 datetime.datetime(1878, 4, 1, 0, 0),
 datetime.datetime(1878, 5, 1, 0, 0),
 datetime.datetime(1878, 6, 1, 0, 0),
 datetime.datetime(1878, 7, 1, 0, 0),
 datetime.datetime(1878, 8, 1, 0, 0),
 datetime.datetime(1878, 9, 1, 0, 0),
 datetime.datetime(1878, 10, 1, 0, 0),
 datetime.datetime(1878, 11, 1, 0, 0),
 datetime.datetime(1878, 12, 1, 0, 0),
 datetime.datetime(1879, 1, 1, 0, 0),
 datetime.datetime(1879, 2, 1, 0, 0),
 datetime.datetime(1879, 3, 1, 0, 0),
 datetime.datetime(1879, 4, 1, 0, 0),
 datetime.datetime(1879, 5, 1, 0, 0),
 datetime.datetime(1879, 6, 1, 0, 0),
 datetime.datetime(1879, 7, 1, 0, 0),
 datetime.datetime(1879, 8, 1, 0, 0),
 datetime.datetime(1879, 9, 1, 0, 0),
 datetime.datetime(1879, 10, 1, 0, 0),
 datetime.datetime(1879, 11, 1, 0, 0),
 datetime.datetime(1879, 12, 1, 0, 0),
 datetime.datetime(1880, 1, 1, 0, 0),
 datetime.datetime(1880, 2, 1, 0, 0),
 datetime.datetime(1880, 3, 1, 0, 0),
 datetime.datetime(1880, 4, 1, 0, 0),
 datetime.datetime(1880, 5, 1, 0, 0),
 datetime.datetime(1880, 6, 1, 0, 0),
 datetime.datetime(1880, 7, 1, 0, 0),
 datetime.datetime(1880, 8, 1, 0, 0),
 datetime.datetime(1880, 9, 1, 0, 0),
 datetime.datetime(1880, 10, 1, 0, 0),
 datetime.datetime(1880, 11, 1, 0, 0),
 datetime.datetime(1880, 12, 1, 0, 0),
 datetime.datetime(1881, 1, 1, 0, 0),
 datetime.datetime(1881, 2, 1, 0, 0),
 datetime.datetime(1881, 3, 1, 0, 0),
 datetime.datetime(1881, 4, 1, 0, 0),
 datetime.datetime(1881, 5, 1, 0, 0),
 datetime.datetime(1881, 6, 1, 0, 0),
 datetime.datetime(1881, 7, 1, 0, 0),
 datetime.datetime(1881, 8, 1, 0, 0),
 datetime.datetime(1881, 9, 1, 0, 0),
 datetime.datetime(1881, 10, 1, 0, 0),
 datetime.datetime(1881, 11, 1, 0, 0),
 datetime.datetime(1881, 12, 1, 0, 0),
 datetime.datetime(1882, 1, 1, 0, 0),
 datetime.datetime(1882, 2, 1, 0, 0),
 datetime.datetime(1882, 3, 1, 0, 0),
 datetime.datetime(1882, 4, 1, 0, 0),
 datetime.datetime(1882, 5, 1, 0, 0),
 datetime.datetime(1882, 6, 1, 0, 0),
 datetime.datetime(1882, 7, 1, 0, 0),
 datetime.datetime(1882, 8, 1, 0, 0),
 datetime.datetime(1882, 9, 1, 0, 0),
 datetime.datetime(1882, 10, 1, 0, 0),
 datetime.datetime(1882, 11, 1, 0, 0),
 datetime.datetime(1882, 12, 1, 0, 0),
 datetime.datetime(1883, 1, 1, 0, 0),
 datetime.datetime(1883, 2, 1, 0, 0),
 datetime.datetime(1883, 3, 1, 0, 0),
 datetime.datetime(1883, 4, 1, 0, 0),
 datetime.datetime(1883, 5, 1, 0, 0),
 datetime.datetime(1883, 6, 1, 0, 0),
 datetime.datetime(1883, 7, 1, 0, 0),
 datetime.datetime(1883, 8, 1, 0, 0),
 datetime.datetime(1883, 9, 1, 0, 0),
 datetime.datetime(1883, 10, 1, 0, 0),
 datetime.datetime(1883, 11, 1, 0, 0),
 datetime.datetime(1883, 12, 1, 0, 0),
 datetime.datetime(1884, 1, 1, 0, 0),
 datetime.datetime(1884, 2, 1, 0, 0),
 datetime.datetime(1884, 3, 1, 0, 0),
 datetime.datetime(1884, 4, 1, 0, 0),
 datetime.datetime(1884, 5, 1, 0, 0),
 datetime.datetime(1884, 6, 1, 0, 0),
 datetime.datetime(1884, 7, 1, 0, 0),
 datetime.datetime(1884, 8, 1, 0, 0),
 datetime.datetime(1884, 9, 1, 0, 0),
 datetime.datetime(1884, 10, 1, 0, 0),
 datetime.datetime(1884, 11, 1, 0, 0),
 datetime.datetime(1884, 12, 1, 0, 0),
 datetime.datetime(1885, 1, 1, 0, 0),
 datetime.datetime(1885, 2, 1, 0, 0),
 datetime.datetime(1885, 3, 1, 0, 0),
 datetime.datetime(1885, 4, 1, 0, 0),
 datetime.datetime(1885, 5, 1, 0, 0),
 datetime.datetime(1885, 6, 1, 0, 0),
 datetime.datetime(1885, 7, 1, 0, 0),
 datetime.datetime(1885, 8, 1, 0, 0),
 datetime.datetime(1885, 9, 1, 0, 0),
 datetime.datetime(1885, 10, 1, 0, 0),
 datetime.datetime(1885, 11, 1, 0, 0),
 datetime.datetime(1885, 12, 1, 0, 0),
 datetime.datetime(1886, 1, 1, 0, 0),
 datetime.datetime(1886, 2, 1, 0, 0),
 datetime.datetime(1886, 3, 1, 0, 0),
 datetime.datetime(1886, 4, 1, 0, 0),
 datetime.datetime(1886, 5, 1, 0, 0),
 datetime.datetime(1886, 6, 1, 0, 0),
 datetime.datetime(1886, 7, 1, 0, 0),
 datetime.datetime(1886, 8, 1, 0, 0),
 datetime.datetime(1886, 9, 1, 0, 0),
 datetime.datetime(1886, 10, 1, 0, 0),
 datetime.datetime(1886, 11, 1, 0, 0),
 datetime.datetime(1886, 12, 1, 0, 0),
 datetime.datetime(1887, 1, 1, 0, 0),
 datetime.datetime(1887, 2, 1, 0, 0),
 datetime.datetime(1887, 3, 1, 0, 0),
 datetime.datetime(1887, 4, 1, 0, 0),
 datetime.datetime(1887, 5, 1, 0, 0),
 datetime.datetime(1887, 6, 1, 0, 0),
 datetime.datetime(1887, 7, 1, 0, 0),
 datetime.datetime(1887, 8, 1, 0, 0),
 datetime.datetime(1887, 9, 1, 0, 0),
 datetime.datetime(1887, 10, 1, 0, 0),
 datetime.datetime(1887, 11, 1, 0, 0),
 datetime.datetime(1887, 12, 1, 0, 0),
 datetime.datetime(1888, 1, 1, 0, 0),
 datetime.datetime(1888, 2, 1, 0, 0),
 datetime.datetime(1888, 3, 1, 0, 0),
 datetime.datetime(1888, 4, 1, 0, 0),
 datetime.datetime(1888, 5, 1, 0, 0),
 datetime.datetime(1888, 6, 1, 0, 0),
 datetime.datetime(1888, 7, 1, 0, 0),
 datetime.datetime(1888, 8, 1, 0, 0),
 datetime.datetime(1888, 9, 1, 0, 0),
 datetime.datetime(1888, 10, 1, 0, 0),
 datetime.datetime(1888, 11, 1, 0, 0),
 datetime.datetime(1888, 12, 1, 0, 0),
 datetime.datetime(1889, 1, 1, 0, 0),
 datetime.datetime(1889, 2, 1, 0, 0),
 datetime.datetime(1889, 3, 1, 0, 0),
 datetime.datetime(1889, 4, 1, 0, 0),
 datetime.datetime(1889, 5, 1, 0, 0),
 datetime.datetime(1889, 6, 1, 0, 0),
 datetime.datetime(1889, 7, 1, 0, 0),
 datetime.datetime(1889, 8, 1, 0, 0),
 datetime.datetime(1889, 9, 1, 0, 0),
 datetime.datetime(1889, 10, 1, 0, 0),
 datetime.datetime(1889, 11, 1, 0, 0),
 datetime.datetime(1889, 12, 1, 0, 0),
 datetime.datetime(1890, 1, 1, 0, 0),
 datetime.datetime(1890, 2, 1, 0, 0),
 datetime.datetime(1890, 3, 1, 0, 0),
 datetime.datetime(1890, 4, 1, 0, 0),
 datetime.datetime(1890, 5, 1, 0, 0),
 datetime.datetime(1890, 6, 1, 0, 0),
 datetime.datetime(1890, 7, 1, 0, 0),
 datetime.datetime(1890, 8, 1, 0, 0),
 datetime.datetime(1890, 9, 1, 0, 0),
 datetime.datetime(1890, 10, 1, 0, 0),
 datetime.datetime(1890, 11, 1, 0, 0),
 datetime.datetime(1890, 12, 1, 0, 0),
 datetime.datetime(1891, 1, 1, 0, 0),
 datetime.datetime(1891, 2, 1, 0, 0),
 datetime.datetime(1891, 3, 1, 0, 0),
 datetime.datetime(1891, 4, 1, 0, 0),
 datetime.datetime(1891, 5, 1, 0, 0),
 datetime.datetime(1891, 6, 1, 0, 0),
 datetime.datetime(1891, 7, 1, 0, 0),
 datetime.datetime(1891, 8, 1, 0, 0),
 datetime.datetime(1891, 9, 1, 0, 0),
 datetime.datetime(1891, 10, 1, 0, 0),
 datetime.datetime(1891, 11, 1, 0, 0),
 datetime.datetime(1891, 12, 1, 0, 0),
 datetime.datetime(1892, 1, 1, 0, 0),
 datetime.datetime(1892, 2, 1, 0, 0),
 datetime.datetime(1892, 3, 1, 0, 0),
 datetime.datetime(1892, 4, 1, 0, 0),
 datetime.datetime(1892, 5, 1, 0, 0),
 datetime.datetime(1892, 6, 1, 0, 0),
 datetime.datetime(1892, 7, 1, 0, 0),
 datetime.datetime(1892, 8, 1, 0, 0),
 datetime.datetime(1892, 9, 1, 0, 0),
 datetime.datetime(1892, 10, 1, 0, 0),
 datetime.datetime(1892, 11, 1, 0, 0),
 datetime.datetime(1892, 12, 1, 0, 0),
 datetime.datetime(1893, 1, 1, 0, 0),
 datetime.datetime(1893, 2, 1, 0, 0),
 datetime.datetime(1893, 3, 1, 0, 0),
 datetime.datetime(1893, 4, 1, 0, 0),
 datetime.datetime(1893, 5, 1, 0, 0),
 datetime.datetime(1893, 6, 1, 0, 0),
 datetime.datetime(1893, 7, 1, 0, 0),
 datetime.datetime(1893, 8, 1, 0, 0),
 datetime.datetime(1893, 9, 1, 0, 0),
 datetime.datetime(1893, 10, 1, 0, 0),
 datetime.datetime(1893, 11, 1, 0, 0),
 datetime.datetime(1893, 12, 1, 0, 0),
 datetime.datetime(1894, 1, 1, 0, 0),
 datetime.datetime(1894, 2, 1, 0, 0),
 datetime.datetime(1894, 3, 1, 0, 0),
 datetime.datetime(1894, 4, 1, 0, 0),
 datetime.datetime(1894, 5, 1, 0, 0),
 datetime.datetime(1894, 6, 1, 0, 0),
 datetime.datetime(1894, 7, 1, 0, 0),
 datetime.datetime(1894, 8, 1, 0, 0),
 datetime.datetime(1894, 9, 1, 0, 0),
 datetime.datetime(1894, 10, 1, 0, 0),
 datetime.datetime(1894, 11, 1, 0, 0),
 datetime.datetime(1894, 12, 1, 0, 0),
 datetime.datetime(1895, 1, 1, 0, 0),
 datetime.datetime(1895, 2, 1, 0, 0),
 datetime.datetime(1895, 3, 1, 0, 0),
 datetime.datetime(1895, 4, 1, 0, 0),
 datetime.datetime(1895, 5, 1, 0, 0),
 datetime.datetime(1895, 6, 1, 0, 0),
 datetime.datetime(1895, 7, 1, 0, 0),
 datetime.datetime(1895, 8, 1, 0, 0),
 datetime.datetime(1895, 9, 1, 0, 0),
 datetime.datetime(1895, 10, 1, 0, 0),
 datetime.datetime(1895, 11, 1, 0, 0),
 datetime.datetime(1895, 12, 1, 0, 0),
 datetime.datetime(1896, 1, 1, 0, 0),
 datetime.datetime(1896, 2, 1, 0, 0),
 datetime.datetime(1896, 3, 1, 0, 0),
 datetime.datetime(1896, 4, 1, 0, 0),
 datetime.datetime(1896, 5, 1, 0, 0),
 datetime.datetime(1896, 6, 1, 0, 0),
 datetime.datetime(1896, 7, 1, 0, 0),
 datetime.datetime(1896, 8, 1, 0, 0),
 datetime.datetime(1896, 9, 1, 0, 0),
 datetime.datetime(1896, 10, 1, 0, 0),
 datetime.datetime(1896, 11, 1, 0, 0),
 datetime.datetime(1896, 12, 1, 0, 0),
 datetime.datetime(1897, 1, 1, 0, 0),
 datetime.datetime(1897, 2, 1, 0, 0),
 datetime.datetime(1897, 3, 1, 0, 0),
 datetime.datetime(1897, 4, 1, 0, 0),
 datetime.datetime(1897, 5, 1, 0, 0),
 datetime.datetime(1897, 6, 1, 0, 0),
 datetime.datetime(1897, 7, 1, 0, 0),
 datetime.datetime(1897, 8, 1, 0, 0),
 datetime.datetime(1897, 9, 1, 0, 0),
 datetime.datetime(1897, 10, 1, 0, 0),
 datetime.datetime(1897, 11, 1, 0, 0),
 datetime.datetime(1897, 12, 1, 0, 0),
 datetime.datetime(1898, 1, 1, 0, 0),
 datetime.datetime(1898, 2, 1, 0, 0),
 datetime.datetime(1898, 3, 1, 0, 0),
 datetime.datetime(1898, 4, 1, 0, 0),
 datetime.datetime(1898, 5, 1, 0, 0),
 datetime.datetime(1898, 6, 1, 0, 0),
 datetime.datetime(1898, 7, 1, 0, 0),
 datetime.datetime(1898, 8, 1, 0, 0),
 datetime.datetime(1898, 9, 1, 0, 0),
 datetime.datetime(1898, 10, 1, 0, 0),
 datetime.datetime(1898, 11, 1, 0, 0),
 datetime.datetime(1898, 12, 1, 0, 0),
 datetime.datetime(1899, 1, 1, 0, 0),
 datetime.datetime(1899, 2, 1, 0, 0),
 datetime.datetime(1899, 3, 1, 0, 0),
 datetime.datetime(1899, 4, 1, 0, 0),
 datetime.datetime(1899, 5, 1, 0, 0),
 datetime.datetime(1899, 6, 1, 0, 0),
 datetime.datetime(1899, 7, 1, 0, 0),
 datetime.datetime(1899, 8, 1, 0, 0),
 datetime.datetime(1899, 9, 1, 0, 0),
 datetime.datetime(1899, 10, 1, 0, 0),
 datetime.datetime(1899, 11, 1, 0, 0),
 datetime.datetime(1899, 12, 1, 0, 0),
 datetime.datetime(1900, 1, 1, 0, 0),
 datetime.datetime(1900, 2, 1, 0, 0),
 datetime.datetime(1900, 3, 1, 0, 0),
 datetime.datetime(1900, 4, 1, 0, 0),
 datetime.datetime(1900, 5, 1, 0, 0),
 datetime.datetime(1900, 6, 1, 0, 0),
 datetime.datetime(1900, 7, 1, 0, 0),
 datetime.datetime(1900, 8, 1, 0, 0),
 datetime.datetime(1900, 9, 1, 0, 0),
 datetime.datetime(1900, 10, 1, 0, 0),
 datetime.datetime(1900, 11, 1, 0, 0),
 datetime.datetime(1900, 12, 1, 0, 0),
 datetime.datetime(1901, 1, 1, 0, 0),
 datetime.datetime(1901, 2, 1, 0, 0),
 datetime.datetime(1901, 3, 1, 0, 0),
 datetime.datetime(1901, 4, 1, 0, 0),
 datetime.datetime(1901, 5, 1, 0, 0),
 datetime.datetime(1901, 6, 1, 0, 0),
 datetime.datetime(1901, 7, 1, 0, 0),
 datetime.datetime(1901, 8, 1, 0, 0),
 datetime.datetime(1901, 9, 1, 0, 0),
 datetime.datetime(1901, 10, 1, 0, 0),
 datetime.datetime(1901, 11, 1, 0, 0),
 datetime.datetime(1901, 12, 1, 0, 0),
 datetime.datetime(1902, 1, 1, 0, 0),
 datetime.datetime(1902, 2, 1, 0, 0),
 datetime.datetime(1902, 3, 1, 0, 0),
 datetime.datetime(1902, 4, 1, 0, 0),
 datetime.datetime(1902, 5, 1, 0, 0),
 datetime.datetime(1902, 6, 1, 0, 0),
 datetime.datetime(1902, 7, 1, 0, 0),
 datetime.datetime(1902, 8, 1, 0, 0),
 datetime.datetime(1902, 9, 1, 0, 0),
 datetime.datetime(1902, 10, 1, 0, 0),
 datetime.datetime(1902, 11, 1, 0, 0),
 datetime.datetime(1902, 12, 1, 0, 0),
 datetime.datetime(1903, 1, 1, 0, 0),
 datetime.datetime(1903, 2, 1, 0, 0),
 datetime.datetime(1903, 3, 1, 0, 0),
 datetime.datetime(1903, 4, 1, 0, 0),
 datetime.datetime(1903, 5, 1, 0, 0),
 datetime.datetime(1903, 6, 1, 0, 0),
 datetime.datetime(1903, 7, 1, 0, 0),
 datetime.datetime(1903, 8, 1, 0, 0),
 datetime.datetime(1903, 9, 1, 0, 0),
 datetime.datetime(1903, 10, 1, 0, 0),
 datetime.datetime(1903, 11, 1, 0, 0),
 datetime.datetime(1903, 12, 1, 0, 0),
 datetime.datetime(1904, 1, 1, 0, 0),
 datetime.datetime(1904, 2, 1, 0, 0),
 datetime.datetime(1904, 3, 1, 0, 0),
 datetime.datetime(1904, 4, 1, 0, 0),
 datetime.datetime(1904, 5, 1, 0, 0),
 datetime.datetime(1904, 6, 1, 0, 0),
 datetime.datetime(1904, 7, 1, 0, 0),
 datetime.datetime(1904, 8, 1, 0, 0),
 datetime.datetime(1904, 9, 1, 0, 0),
 datetime.datetime(1904, 10, 1, 0, 0),
 datetime.datetime(1904, 11, 1, 0, 0),
 datetime.datetime(1904, 12, 1, 0, 0),
 datetime.datetime(1905, 1, 1, 0, 0),
 datetime.datetime(1905, 2, 1, 0, 0),
 datetime.datetime(1905, 3, 1, 0, 0),
 datetime.datetime(1905, 4, 1, 0, 0),
 datetime.datetime(1905, 5, 1, 0, 0),
 datetime.datetime(1905, 6, 1, 0, 0),
 datetime.datetime(1905, 7, 1, 0, 0),
 datetime.datetime(1905, 8, 1, 0, 0),
 datetime.datetime(1905, 9, 1, 0, 0),
 datetime.datetime(1905, 10, 1, 0, 0),
 datetime.datetime(1905, 11, 1, 0, 0),
 datetime.datetime(1905, 12, 1, 0, 0),
 datetime.datetime(1906, 1, 1, 0, 0),
 datetime.datetime(1906, 2, 1, 0, 0),
 datetime.datetime(1906, 3, 1, 0, 0),
 datetime.datetime(1906, 4, 1, 0, 0),
 datetime.datetime(1906, 5, 1, 0, 0),
 datetime.datetime(1906, 6, 1, 0, 0),
 datetime.datetime(1906, 7, 1, 0, 0),
 datetime.datetime(1906, 8, 1, 0, 0),
 datetime.datetime(1906, 9, 1, 0, 0),
 datetime.datetime(1906, 10, 1, 0, 0),
 datetime.datetime(1906, 11, 1, 0, 0),
 datetime.datetime(1906, 12, 1, 0, 0),
 datetime.datetime(1907, 1, 1, 0, 0),
 datetime.datetime(1907, 2, 1, 0, 0),
 datetime.datetime(1907, 3, 1, 0, 0),
 datetime.datetime(1907, 4, 1, 0, 0),
 datetime.datetime(1907, 5, 1, 0, 0),
 datetime.datetime(1907, 6, 1, 0, 0),
 datetime.datetime(1907, 7, 1, 0, 0),
 datetime.datetime(1907, 8, 1, 0, 0),
 datetime.datetime(1907, 9, 1, 0, 0),
 datetime.datetime(1907, 10, 1, 0, 0),
 datetime.datetime(1907, 11, 1, 0, 0),
 datetime.datetime(1907, 12, 1, 0, 0),
 datetime.datetime(1908, 1, 1, 0, 0),
 datetime.datetime(1908, 2, 1, 0, 0),
 datetime.datetime(1908, 3, 1, 0, 0),
 datetime.datetime(1908, 4, 1, 0, 0),
 datetime.datetime(1908, 5, 1, 0, 0),
 datetime.datetime(1908, 6, 1, 0, 0),
 datetime.datetime(1908, 7, 1, 0, 0),
 datetime.datetime(1908, 8, 1, 0, 0),
 datetime.datetime(1908, 9, 1, 0, 0),
 datetime.datetime(1908, 10, 1, 0, 0),
 datetime.datetime(1908, 11, 1, 0, 0),
 datetime.datetime(1908, 12, 1, 0, 0),
 datetime.datetime(1909, 1, 1, 0, 0),
 datetime.datetime(1909, 2, 1, 0, 0),
 datetime.datetime(1909, 3, 1, 0, 0),
 datetime.datetime(1909, 4, 1, 0, 0),
 datetime.datetime(1909, 5, 1, 0, 0),
 datetime.datetime(1909, 6, 1, 0, 0),
 datetime.datetime(1909, 7, 1, 0, 0),
 datetime.datetime(1909, 8, 1, 0, 0),
 datetime.datetime(1909, 9, 1, 0, 0),
 datetime.datetime(1909, 10, 1, 0, 0),
 datetime.datetime(1909, 11, 1, 0, 0),
 datetime.datetime(1909, 12, 1, 0, 0),
 datetime.datetime(1910, 1, 1, 0, 0),
 datetime.datetime(1910, 2, 1, 0, 0),
 datetime.datetime(1910, 3, 1, 0, 0),
 datetime.datetime(1910, 4, 1, 0, 0),
 datetime.datetime(1910, 5, 1, 0, 0),
 datetime.datetime(1910, 6, 1, 0, 0),
 datetime.datetime(1910, 7, 1, 0, 0),
 datetime.datetime(1910, 8, 1, 0, 0),
 datetime.datetime(1910, 9, 1, 0, 0),
 datetime.datetime(1910, 10, 1, 0, 0),
 datetime.datetime(1910, 11, 1, 0, 0),
 datetime.datetime(1910, 12, 1, 0, 0),
 datetime.datetime(1911, 1, 1, 0, 0),
 datetime.datetime(1911, 2, 1, 0, 0),
 datetime.datetime(1911, 3, 1, 0, 0),
 datetime.datetime(1911, 4, 1, 0, 0),
 datetime.datetime(1911, 5, 1, 0, 0),
 datetime.datetime(1911, 6, 1, 0, 0),
 datetime.datetime(1911, 7, 1, 0, 0),
 datetime.datetime(1911, 8, 1, 0, 0),
 datetime.datetime(1911, 9, 1, 0, 0),
 datetime.datetime(1911, 10, 1, 0, 0),
 datetime.datetime(1911, 11, 1, 0, 0),
 datetime.datetime(1911, 12, 1, 0, 0),
 datetime.datetime(1912, 1, 1, 0, 0),
 datetime.datetime(1912, 2, 1, 0, 0),
 datetime.datetime(1912, 3, 1, 0, 0),
 datetime.datetime(1912, 4, 1, 0, 0),
 datetime.datetime(1912, 5, 1, 0, 0),
 datetime.datetime(1912, 6, 1, 0, 0),
 datetime.datetime(1912, 7, 1, 0, 0),
 datetime.datetime(1912, 8, 1, 0, 0),
 datetime.datetime(1912, 9, 1, 0, 0),
 datetime.datetime(1912, 10, 1, 0, 0),
 datetime.datetime(1912, 11, 1, 0, 0),
 datetime.datetime(1912, 12, 1, 0, 0),
 datetime.datetime(1913, 1, 1, 0, 0),
 datetime.datetime(1913, 2, 1, 0, 0),
 datetime.datetime(1913, 3, 1, 0, 0),
 datetime.datetime(1913, 4, 1, 0, 0),
 datetime.datetime(1913, 5, 1, 0, 0),
 datetime.datetime(1913, 6, 1, 0, 0),
 datetime.datetime(1913, 7, 1, 0, 0),
 datetime.datetime(1913, 8, 1, 0, 0),
 datetime.datetime(1913, 9, 1, 0, 0),
 datetime.datetime(1913, 10, 1, 0, 0),
 datetime.datetime(1913, 11, 1, 0, 0),
 datetime.datetime(1913, 12, 1, 0, 0),
 datetime.datetime(1914, 1, 1, 0, 0),
 datetime.datetime(1914, 2, 1, 0, 0),
 datetime.datetime(1914, 3, 1, 0, 0),
 datetime.datetime(1914, 4, 1, 0, 0),
 datetime.datetime(1914, 5, 1, 0, 0),
 datetime.datetime(1914, 6, 1, 0, 0),
 datetime.datetime(1914, 7, 1, 0, 0),
 datetime.datetime(1914, 8, 1, 0, 0),
 datetime.datetime(1914, 9, 1, 0, 0),
 datetime.datetime(1914, 10, 1, 0, 0),
 datetime.datetime(1914, 11, 1, 0, 0),
 datetime.datetime(1914, 12, 1, 0, 0),
 datetime.datetime(1915, 1, 1, 0, 0),
 datetime.datetime(1915, 2, 1, 0, 0),
 datetime.datetime(1915, 3, 1, 0, 0),
 datetime.datetime(1915, 4, 1, 0, 0),
 datetime.datetime(1915, 5, 1, 0, 0),
 datetime.datetime(1915, 6, 1, 0, 0),
 datetime.datetime(1915, 7, 1, 0, 0),
 datetime.datetime(1915, 8, 1, 0, 0),
 datetime.datetime(1915, 9, 1, 0, 0),
 datetime.datetime(1915, 10, 1, 0, 0),
 datetime.datetime(1915, 11, 1, 0, 0),
 datetime.datetime(1915, 12, 1, 0, 0),
 datetime.datetime(1916, 1, 1, 0, 0),
 datetime.datetime(1916, 2, 1, 0, 0),
 datetime.datetime(1916, 3, 1, 0, 0),
 datetime.datetime(1916, 4, 1, 0, 0),
 datetime.datetime(1916, 5, 1, 0, 0),
 datetime.datetime(1916, 6, 1, 0, 0),
 datetime.datetime(1916, 7, 1, 0, 0),
 datetime.datetime(1916, 8, 1, 0, 0),
 datetime.datetime(1916, 9, 1, 0, 0),
 datetime.datetime(1916, 10, 1, 0, 0),
 datetime.datetime(1916, 11, 1, 0, 0),
 datetime.datetime(1916, 12, 1, 0, 0),
 datetime.datetime(1917, 1, 1, 0, 0),
 datetime.datetime(1917, 2, 1, 0, 0),
 datetime.datetime(1917, 3, 1, 0, 0),
 datetime.datetime(1917, 4, 1, 0, 0),
 datetime.datetime(1917, 5, 1, 0, 0),
 datetime.datetime(1917, 6, 1, 0, 0),
 datetime.datetime(1917, 7, 1, 0, 0),
 datetime.datetime(1917, 8, 1, 0, 0),
 datetime.datetime(1917, 9, 1, 0, 0),
 datetime.datetime(1917, 10, 1, 0, 0),
 datetime.datetime(1917, 11, 1, 0, 0),
 datetime.datetime(1917, 12, 1, 0, 0),
 datetime.datetime(1918, 1, 1, 0, 0),
 datetime.datetime(1918, 2, 1, 0, 0),
 datetime.datetime(1918, 3, 1, 0, 0),
 datetime.datetime(1918, 4, 1, 0, 0),
 datetime.datetime(1918, 5, 1, 0, 0),
 datetime.datetime(1918, 6, 1, 0, 0),
 datetime.datetime(1918, 7, 1, 0, 0),
 datetime.datetime(1918, 8, 1, 0, 0),
 datetime.datetime(1918, 9, 1, 0, 0),
 datetime.datetime(1918, 10, 1, 0, 0),
 datetime.datetime(1918, 11, 1, 0, 0),
 datetime.datetime(1918, 12, 1, 0, 0),
 datetime.datetime(1919, 1, 1, 0, 0),
 datetime.datetime(1919, 2, 1, 0, 0),
 datetime.datetime(1919, 3, 1, 0, 0),
 datetime.datetime(1919, 4, 1, 0, 0),
 datetime.datetime(1919, 5, 1, 0, 0),
 datetime.datetime(1919, 6, 1, 0, 0),
 datetime.datetime(1919, 7, 1, 0, 0),
 datetime.datetime(1919, 8, 1, 0, 0),
 datetime.datetime(1919, 9, 1, 0, 0),
 datetime.datetime(1919, 10, 1, 0, 0),
 datetime.datetime(1919, 11, 1, 0, 0),
 datetime.datetime(1919, 12, 1, 0, 0),
 datetime.datetime(1920, 1, 1, 0, 0),
 datetime.datetime(1920, 2, 1, 0, 0),
 datetime.datetime(1920, 3, 1, 0, 0),
 datetime.datetime(1920, 4, 1, 0, 0),
 datetime.datetime(1920, 5, 1, 0, 0),
 datetime.datetime(1920, 6, 1, 0, 0),
 datetime.datetime(1920, 7, 1, 0, 0),
 datetime.datetime(1920, 8, 1, 0, 0),
 datetime.datetime(1920, 9, 1, 0, 0),
 datetime.datetime(1920, 10, 1, 0, 0),
 datetime.datetime(1920, 11, 1, 0, 0),
 datetime.datetime(1920, 12, 1, 0, 0),
 datetime.datetime(1921, 1, 1, 0, 0),
 datetime.datetime(1921, 2, 1, 0, 0),
 datetime.datetime(1921, 3, 1, 0, 0),
 datetime.datetime(1921, 4, 1, 0, 0),
 datetime.datetime(1921, 5, 1, 0, 0),
 datetime.datetime(1921, 6, 1, 0, 0),
 datetime.datetime(1921, 7, 1, 0, 0),
 datetime.datetime(1921, 8, 1, 0, 0),
 datetime.datetime(1921, 9, 1, 0, 0),
 datetime.datetime(1921, 10, 1, 0, 0),
 datetime.datetime(1921, 11, 1, 0, 0),
 datetime.datetime(1921, 12, 1, 0, 0),
 datetime.datetime(1922, 1, 1, 0, 0),
 datetime.datetime(1922, 2, 1, 0, 0),
 datetime.datetime(1922, 3, 1, 0, 0),
 datetime.datetime(1922, 4, 1, 0, 0),
 datetime.datetime(1922, 5, 1, 0, 0),
 datetime.datetime(1922, 6, 1, 0, 0),
 datetime.datetime(1922, 7, 1, 0, 0),
 datetime.datetime(1922, 8, 1, 0, 0),
 datetime.datetime(1922, 9, 1, 0, 0),
 datetime.datetime(1922, 10, 1, 0, 0),
 datetime.datetime(1922, 11, 1, 0, 0),
 datetime.datetime(1922, 12, 1, 0, 0),
 datetime.datetime(1923, 1, 1, 0, 0),
 datetime.datetime(1923, 2, 1, 0, 0),
 datetime.datetime(1923, 3, 1, 0, 0),
 datetime.datetime(1923, 4, 1, 0, 0),
 datetime.datetime(1923, 5, 1, 0, 0),
 datetime.datetime(1923, 6, 1, 0, 0),
 datetime.datetime(1923, 7, 1, 0, 0),
 datetime.datetime(1923, 8, 1, 0, 0),
 datetime.datetime(1923, 9, 1, 0, 0),
 datetime.datetime(1923, 10, 1, 0, 0),
 datetime.datetime(1923, 11, 1, 0, 0),
 datetime.datetime(1923, 12, 1, 0, 0),
 datetime.datetime(1924, 1, 1, 0, 0),
 datetime.datetime(1924, 2, 1, 0, 0),
 datetime.datetime(1924, 3, 1, 0, 0),
 datetime.datetime(1924, 4, 1, 0, 0),
 datetime.datetime(1924, 5, 1, 0, 0),
 datetime.datetime(1924, 6, 1, 0, 0),
 datetime.datetime(1924, 7, 1, 0, 0),
 datetime.datetime(1924, 8, 1, 0, 0),
 datetime.datetime(1924, 9, 1, 0, 0),
 datetime.datetime(1924, 10, 1, 0, 0),
 datetime.datetime(1924, 11, 1, 0, 0),
 datetime.datetime(1924, 12, 1, 0, 0),
 datetime.datetime(1925, 1, 1, 0, 0),
 datetime.datetime(1925, 2, 1, 0, 0),
 datetime.datetime(1925, 3, 1, 0, 0),
 datetime.datetime(1925, 4, 1, 0, 0),
 datetime.datetime(1925, 5, 1, 0, 0),
 datetime.datetime(1925, 6, 1, 0, 0),
 datetime.datetime(1925, 7, 1, 0, 0),
 datetime.datetime(1925, 8, 1, 0, 0),
 datetime.datetime(1925, 9, 1, 0, 0),
 datetime.datetime(1925, 10, 1, 0, 0),
 datetime.datetime(1925, 11, 1, 0, 0),
 datetime.datetime(1925, 12, 1, 0, 0),
 datetime.datetime(1926, 1, 1, 0, 0),
 datetime.datetime(1926, 2, 1, 0, 0),
 datetime.datetime(1926, 3, 1, 0, 0),
 datetime.datetime(1926, 4, 1, 0, 0),
 datetime.datetime(1926, 5, 1, 0, 0),
 datetime.datetime(1926, 6, 1, 0, 0),
 datetime.datetime(1926, 7, 1, 0, 0),
 datetime.datetime(1926, 8, 1, 0, 0),
 datetime.datetime(1926, 9, 1, 0, 0),
 datetime.datetime(1926, 10, 1, 0, 0),
 datetime.datetime(1926, 11, 1, 0, 0),
 datetime.datetime(1926, 12, 1, 0, 0),
 datetime.datetime(1927, 1, 1, 0, 0),
 datetime.datetime(1927, 2, 1, 0, 0),
 datetime.datetime(1927, 3, 1, 0, 0),
 datetime.datetime(1927, 4, 1, 0, 0),
 datetime.datetime(1927, 5, 1, 0, 0),
 datetime.datetime(1927, 6, 1, 0, 0),
 datetime.datetime(1927, 7, 1, 0, 0),
 datetime.datetime(1927, 8, 1, 0, 0),
 datetime.datetime(1927, 9, 1, 0, 0),
 datetime.datetime(1927, 10, 1, 0, 0),
 datetime.datetime(1927, 11, 1, 0, 0),
 datetime.datetime(1927, 12, 1, 0, 0),
 datetime.datetime(1928, 1, 1, 0, 0),
 datetime.datetime(1928, 2, 1, 0, 0),
 datetime.datetime(1928, 3, 1, 0, 0),
 datetime.datetime(1928, 4, 1, 0, 0),
 datetime.datetime(1928, 5, 1, 0, 0),
 datetime.datetime(1928, 6, 1, 0, 0),
 datetime.datetime(1928, 7, 1, 0, 0),
 datetime.datetime(1928, 8, 1, 0, 0),
 datetime.datetime(1928, 9, 1, 0, 0),
 datetime.datetime(1928, 10, 1, 0, 0),
 datetime.datetime(1928, 11, 1, 0, 0),
 datetime.datetime(1928, 12, 1, 0, 0),
 datetime.datetime(1929, 1, 1, 0, 0),
 datetime.datetime(1929, 2, 1, 0, 0),
 datetime.datetime(1929, 3, 1, 0, 0),
 datetime.datetime(1929, 4, 1, 0, 0),
 datetime.datetime(1929, 5, 1, 0, 0),
 datetime.datetime(1929, 6, 1, 0, 0),
 datetime.datetime(1929, 7, 1, 0, 0),
 datetime.datetime(1929, 8, 1, 0, 0),
 datetime.datetime(1929, 9, 1, 0, 0),
 datetime.datetime(1929, 10, 1, 0, 0),
 datetime.datetime(1929, 11, 1, 0, 0),
 datetime.datetime(1929, 12, 1, 0, 0),
 datetime.datetime(1930, 1, 1, 0, 0),
 datetime.datetime(1930, 2, 1, 0, 0),
 datetime.datetime(1930, 3, 1, 0, 0),
 datetime.datetime(1930, 4, 1, 0, 0),
 datetime.datetime(1930, 5, 1, 0, 0),
 datetime.datetime(1930, 6, 1, 0, 0),
 datetime.datetime(1930, 7, 1, 0, 0),
 datetime.datetime(1930, 8, 1, 0, 0),
 datetime.datetime(1930, 9, 1, 0, 0),
 datetime.datetime(1930, 10, 1, 0, 0),
 datetime.datetime(1930, 11, 1, 0, 0),
 datetime.datetime(1930, 12, 1, 0, 0),
 datetime.datetime(1931, 1, 1, 0, 0),
 datetime.datetime(1931, 2, 1, 0, 0),
 datetime.datetime(1931, 3, 1, 0, 0),
 datetime.datetime(1931, 4, 1, 0, 0),
 datetime.datetime(1931, 5, 1, 0, 0),
 datetime.datetime(1931, 6, 1, 0, 0),
 datetime.datetime(1931, 7, 1, 0, 0),
 datetime.datetime(1931, 8, 1, 0, 0),
 datetime.datetime(1931, 9, 1, 0, 0),
 datetime.datetime(1931, 10, 1, 0, 0),
 datetime.datetime(1931, 11, 1, 0, 0),
 datetime.datetime(1931, 12, 1, 0, 0),
 datetime.datetime(1932, 1, 1, 0, 0),
 datetime.datetime(1932, 2, 1, 0, 0),
 datetime.datetime(1932, 3, 1, 0, 0),
 datetime.datetime(1932, 4, 1, 0, 0),
 datetime.datetime(1932, 5, 1, 0, 0),
 datetime.datetime(1932, 6, 1, 0, 0),
 datetime.datetime(1932, 7, 1, 0, 0),
 datetime.datetime(1932, 8, 1, 0, 0),
 datetime.datetime(1932, 9, 1, 0, 0),
 datetime.datetime(1932, 10, 1, 0, 0),
 datetime.datetime(1932, 11, 1, 0, 0),
 datetime.datetime(1932, 12, 1, 0, 0),
 datetime.datetime(1933, 1, 1, 0, 0),
 datetime.datetime(1933, 2, 1, 0, 0),
 datetime.datetime(1933, 3, 1, 0, 0),
 datetime.datetime(1933, 4, 1, 0, 0),
 datetime.datetime(1933, 5, 1, 0, 0),
 datetime.datetime(1933, 6, 1, 0, 0),
 datetime.datetime(1933, 7, 1, 0, 0),
 datetime.datetime(1933, 8, 1, 0, 0),
 datetime.datetime(1933, 9, 1, 0, 0),
 datetime.datetime(1933, 10, 1, 0, 0),
 datetime.datetime(1933, 11, 1, 0, 0),
 datetime.datetime(1933, 12, 1, 0, 0),
 datetime.datetime(1934, 1, 1, 0, 0),
 datetime.datetime(1934, 2, 1, 0, 0),
 datetime.datetime(1934, 3, 1, 0, 0),
 datetime.datetime(1934, 4, 1, 0, 0),
 datetime.datetime(1934, 5, 1, 0, 0),
 datetime.datetime(1934, 6, 1, 0, 0),
 datetime.datetime(1934, 7, 1, 0, 0),
 datetime.datetime(1934, 8, 1, 0, 0),
 datetime.datetime(1934, 9, 1, 0, 0),
 datetime.datetime(1934, 10, 1, 0, 0),
 datetime.datetime(1934, 11, 1, 0, 0),
 datetime.datetime(1934, 12, 1, 0, 0),
 datetime.datetime(1935, 1, 1, 0, 0),
 datetime.datetime(1935, 2, 1, 0, 0),
 datetime.datetime(1935, 3, 1, 0, 0),
 datetime.datetime(1935, 4, 1, 0, 0),
 datetime.datetime(1935, 5, 1, 0, 0),
 datetime.datetime(1935, 6, 1, 0, 0),
 datetime.datetime(1935, 7, 1, 0, 0),
 datetime.datetime(1935, 8, 1, 0, 0),
 datetime.datetime(1935, 9, 1, 0, 0),
 datetime.datetime(1935, 10, 1, 0, 0),
 datetime.datetime(1935, 11, 1, 0, 0),
 datetime.datetime(1935, 12, 1, 0, 0),
 datetime.datetime(1936, 1, 1, 0, 0),
 datetime.datetime(1936, 2, 1, 0, 0),
 datetime.datetime(1936, 3, 1, 0, 0),
 datetime.datetime(1936, 4, 1, 0, 0),
 datetime.datetime(1936, 5, 1, 0, 0),
 datetime.datetime(1936, 6, 1, 0, 0),
 datetime.datetime(1936, 7, 1, 0, 0),
 datetime.datetime(1936, 8, 1, 0, 0),
 datetime.datetime(1936, 9, 1, 0, 0),
 datetime.datetime(1936, 10, 1, 0, 0),
 datetime.datetime(1936, 11, 1, 0, 0),
 datetime.datetime(1936, 12, 1, 0, 0),
 datetime.datetime(1937, 1, 1, 0, 0),
 datetime.datetime(1937, 2, 1, 0, 0),
 datetime.datetime(1937, 3, 1, 0, 0),
 datetime.datetime(1937, 4, 1, 0, 0),
 datetime.datetime(1937, 5, 1, 0, 0),
 datetime.datetime(1937, 6, 1, 0, 0),
 datetime.datetime(1937, 7, 1, 0, 0),
 datetime.datetime(1937, 8, 1, 0, 0),
 datetime.datetime(1937, 9, 1, 0, 0),
 datetime.datetime(1937, 10, 1, 0, 0),
 datetime.datetime(1937, 11, 1, 0, 0),
 datetime.datetime(1937, 12, 1, 0, 0),
 datetime.datetime(1938, 1, 1, 0, 0),
 datetime.datetime(1938, 2, 1, 0, 0),
 datetime.datetime(1938, 3, 1, 0, 0),
 datetime.datetime(1938, 4, 1, 0, 0),
 datetime.datetime(1938, 5, 1, 0, 0),
 datetime.datetime(1938, 6, 1, 0, 0),
 datetime.datetime(1938, 7, 1, 0, 0),
 datetime.datetime(1938, 8, 1, 0, 0),
 datetime.datetime(1938, 9, 1, 0, 0),
 datetime.datetime(1938, 10, 1, 0, 0),
 datetime.datetime(1938, 11, 1, 0, 0),
 datetime.datetime(1938, 12, 1, 0, 0),
 datetime.datetime(1939, 1, 1, 0, 0),
 datetime.datetime(1939, 2, 1, 0, 0),
 datetime.datetime(1939, 3, 1, 0, 0),
 datetime.datetime(1939, 4, 1, 0, 0),
 datetime.datetime(1939, 5, 1, 0, 0),
 datetime.datetime(1939, 6, 1, 0, 0),
 datetime.datetime(1939, 7, 1, 0, 0),
 datetime.datetime(1939, 8, 1, 0, 0),
 datetime.datetime(1939, 9, 1, 0, 0),
 datetime.datetime(1939, 10, 1, 0, 0),
 datetime.datetime(1939, 11, 1, 0, 0),
 datetime.datetime(1939, 12, 1, 0, 0),
 datetime.datetime(1940, 1, 1, 0, 0),
 datetime.datetime(1940, 2, 1, 0, 0),
 datetime.datetime(1940, 3, 1, 0, 0),
 datetime.datetime(1940, 4, 1, 0, 0),
 datetime.datetime(1940, 5, 1, 0, 0),
 datetime.datetime(1940, 6, 1, 0, 0),
 datetime.datetime(1940, 7, 1, 0, 0),
 datetime.datetime(1940, 8, 1, 0, 0),
 datetime.datetime(1940, 9, 1, 0, 0),
 datetime.datetime(1940, 10, 1, 0, 0),
 datetime.datetime(1940, 11, 1, 0, 0),
 datetime.datetime(1940, 12, 1, 0, 0),
 datetime.datetime(1941, 1, 1, 0, 0),
 datetime.datetime(1941, 2, 1, 0, 0),
 datetime.datetime(1941, 3, 1, 0, 0),
 datetime.datetime(1941, 4, 1, 0, 0),
 datetime.datetime(1941, 5, 1, 0, 0),
 datetime.datetime(1941, 6, 1, 0, 0),
 datetime.datetime(1941, 7, 1, 0, 0),
 datetime.datetime(1941, 8, 1, 0, 0),
 datetime.datetime(1941, 9, 1, 0, 0),
 datetime.datetime(1941, 10, 1, 0, 0),
 datetime.datetime(1941, 11, 1, 0, 0),
 datetime.datetime(1941, 12, 1, 0, 0),
 datetime.datetime(1942, 1, 1, 0, 0),
 datetime.datetime(1942, 2, 1, 0, 0),
 datetime.datetime(1942, 3, 1, 0, 0),
 datetime.datetime(1942, 4, 1, 0, 0),
 datetime.datetime(1942, 5, 1, 0, 0),
 datetime.datetime(1942, 6, 1, 0, 0),
 datetime.datetime(1942, 7, 1, 0, 0),
 datetime.datetime(1942, 8, 1, 0, 0),
 datetime.datetime(1942, 9, 1, 0, 0),
 datetime.datetime(1942, 10, 1, 0, 0),
 datetime.datetime(1942, 11, 1, 0, 0),
 datetime.datetime(1942, 12, 1, 0, 0),
 datetime.datetime(1943, 1, 1, 0, 0),
 datetime.datetime(1943, 2, 1, 0, 0),
 datetime.datetime(1943, 3, 1, 0, 0),
 datetime.datetime(1943, 4, 1, 0, 0),
 datetime.datetime(1943, 5, 1, 0, 0),
 datetime.datetime(1943, 6, 1, 0, 0),
 datetime.datetime(1943, 7, 1, 0, 0),
 datetime.datetime(1943, 8, 1, 0, 0),
 datetime.datetime(1943, 9, 1, 0, 0),
 datetime.datetime(1943, 10, 1, 0, 0),
 datetime.datetime(1943, 11, 1, 0, 0),
 datetime.datetime(1943, 12, 1, 0, 0),
 datetime.datetime(1944, 1, 1, 0, 0),
 datetime.datetime(1944, 2, 1, 0, 0),
 datetime.datetime(1944, 3, 1, 0, 0),
 datetime.datetime(1944, 4, 1, 0, 0),
 datetime.datetime(1944, 5, 1, 0, 0),
 datetime.datetime(1944, 6, 1, 0, 0),
 datetime.datetime(1944, 7, 1, 0, 0),
 datetime.datetime(1944, 8, 1, 0, 0),
 datetime.datetime(1944, 9, 1, 0, 0),
 datetime.datetime(1944, 10, 1, 0, 0),
 datetime.datetime(1944, 11, 1, 0, 0),
 datetime.datetime(1944, 12, 1, 0, 0),
 datetime.datetime(1945, 1, 1, 0, 0),
 datetime.datetime(1945, 2, 1, 0, 0),
 datetime.datetime(1945, 3, 1, 0, 0),
 datetime.datetime(1945, 4, 1, 0, 0),
 datetime.datetime(1945, 5, 1, 0, 0),
 datetime.datetime(1945, 6, 1, 0, 0),
 datetime.datetime(1945, 7, 1, 0, 0),
 datetime.datetime(1945, 8, 1, 0, 0),
 datetime.datetime(1945, 9, 1, 0, 0),
 datetime.datetime(1945, 10, 1, 0, 0),
 datetime.datetime(1945, 11, 1, 0, 0),
 datetime.datetime(1945, 12, 1, 0, 0),
 datetime.datetime(1946, 1, 1, 0, 0),
 datetime.datetime(1946, 2, 1, 0, 0),
 datetime.datetime(1946, 3, 1, 0, 0),
 datetime.datetime(1946, 4, 1, 0, 0),
 datetime.datetime(1946, 5, 1, 0, 0),
 datetime.datetime(1946, 6, 1, 0, 0),
 datetime.datetime(1946, 7, 1, 0, 0),
 datetime.datetime(1946, 8, 1, 0, 0),
 datetime.datetime(1946, 9, 1, 0, 0),
 datetime.datetime(1946, 10, 1, 0, 0),
 datetime.datetime(1946, 11, 1, 0, 0),
 datetime.datetime(1946, 12, 1, 0, 0),
 datetime.datetime(1947, 1, 1, 0, 0),
 datetime.datetime(1947, 2, 1, 0, 0),
 datetime.datetime(1947, 3, 1, 0, 0),
 datetime.datetime(1947, 4, 1, 0, 0),
 datetime.datetime(1947, 5, 1, 0, 0),
 datetime.datetime(1947, 6, 1, 0, 0),
 datetime.datetime(1947, 7, 1, 0, 0),
 datetime.datetime(1947, 8, 1, 0, 0),
 datetime.datetime(1947, 9, 1, 0, 0),
 datetime.datetime(1947, 10, 1, 0, 0),
 datetime.datetime(1947, 11, 1, 0, 0),
 datetime.datetime(1947, 12, 1, 0, 0),
 datetime.datetime(1948, 1, 1, 0, 0),
 datetime.datetime(1948, 2, 1, 0, 0),
 datetime.datetime(1948, 3, 1, 0, 0),
 datetime.datetime(1948, 4, 1, 0, 0),
 datetime.datetime(1948, 5, 1, 0, 0),
 datetime.datetime(1948, 6, 1, 0, 0),
 datetime.datetime(1948, 7, 1, 0, 0),
 datetime.datetime(1948, 8, 1, 0, 0),
 datetime.datetime(1948, 9, 1, 0, 0),
 datetime.datetime(1948, 10, 1, 0, 0),
 datetime.datetime(1948, 11, 1, 0, 0),
 datetime.datetime(1948, 12, 1, 0, 0),
 datetime.datetime(1949, 1, 1, 0, 0),
 datetime.datetime(1949, 2, 1, 0, 0),
 datetime.datetime(1949, 3, 1, 0, 0),
 datetime.datetime(1949, 4, 1, 0, 0),
 datetime.datetime(1949, 5, 1, 0, 0),
 datetime.datetime(1949, 6, 1, 0, 0),
 datetime.datetime(1949, 7, 1, 0, 0),
 datetime.datetime(1949, 8, 1, 0, 0),
 datetime.datetime(1949, 9, 1, 0, 0),
 datetime.datetime(1949, 10, 1, 0, 0),
 datetime.datetime(1949, 11, 1, 0, 0),
 datetime.datetime(1949, 12, 1, 0, 0),
 datetime.datetime(1950, 1, 1, 0, 0),
 datetime.datetime(1950, 2, 1, 0, 0),
 datetime.datetime(1950, 3, 1, 0, 0),
 datetime.datetime(1950, 4, 1, 0, 0),
 datetime.datetime(1950, 5, 1, 0, 0),
 datetime.datetime(1950, 6, 1, 0, 0),
 datetime.datetime(1950, 7, 1, 0, 0),
 datetime.datetime(1950, 8, 1, 0, 0),
 datetime.datetime(1950, 9, 1, 0, 0),
 datetime.datetime(1950, 10, 1, 0, 0),
 datetime.datetime(1950, 11, 1, 0, 0),
 datetime.datetime(1950, 12, 1, 0, 0),
 datetime.datetime(1951, 1, 1, 0, 0),
 datetime.datetime(1951, 2, 1, 0, 0),
 datetime.datetime(1951, 3, 1, 0, 0),
 datetime.datetime(1951, 4, 1, 0, 0),
 datetime.datetime(1951, 5, 1, 0, 0),
 datetime.datetime(1951, 6, 1, 0, 0),
 datetime.datetime(1951, 7, 1, 0, 0),
 datetime.datetime(1951, 8, 1, 0, 0),
 datetime.datetime(1951, 9, 1, 0, 0),
 datetime.datetime(1951, 10, 1, 0, 0),
 datetime.datetime(1951, 11, 1, 0, 0),
 datetime.datetime(1951, 12, 1, 0, 0),
 datetime.datetime(1952, 1, 1, 0, 0),
 datetime.datetime(1952, 2, 1, 0, 0),
 datetime.datetime(1952, 3, 1, 0, 0),
 datetime.datetime(1952, 4, 1, 0, 0),
 datetime.datetime(1952, 5, 1, 0, 0),
 datetime.datetime(1952, 6, 1, 0, 0),
 datetime.datetime(1952, 7, 1, 0, 0),
 datetime.datetime(1952, 8, 1, 0, 0),
 datetime.datetime(1952, 9, 1, 0, 0),
 datetime.datetime(1952, 10, 1, 0, 0),
 datetime.datetime(1952, 11, 1, 0, 0),
 datetime.datetime(1952, 12, 1, 0, 0),
 datetime.datetime(1953, 1, 1, 0, 0),
 datetime.datetime(1953, 2, 1, 0, 0),
 datetime.datetime(1953, 3, 1, 0, 0),
 datetime.datetime(1953, 4, 1, 0, 0),
 datetime.datetime(1953, 5, 1, 0, 0),
 datetime.datetime(1953, 6, 1, 0, 0),
 datetime.datetime(1953, 7, 1, 0, 0),
 datetime.datetime(1953, 8, 1, 0, 0),
 datetime.datetime(1953, 9, 1, 0, 0),
 datetime.datetime(1953, 10, 1, 0, 0),
 datetime.datetime(1953, 11, 1, 0, 0),
 datetime.datetime(1953, 12, 1, 0, 0),
 datetime.datetime(1954, 1, 1, 0, 0),
 datetime.datetime(1954, 2, 1, 0, 0),
 datetime.datetime(1954, 3, 1, 0, 0),
 datetime.datetime(1954, 4, 1, 0, 0),
 datetime.datetime(1954, 5, 1, 0, 0),
 datetime.datetime(1954, 6, 1, 0, 0),
 datetime.datetime(1954, 7, 1, 0, 0),
 datetime.datetime(1954, 8, 1, 0, 0),
 datetime.datetime(1954, 9, 1, 0, 0),
 datetime.datetime(1954, 10, 1, 0, 0),
 datetime.datetime(1954, 11, 1, 0, 0),
 datetime.datetime(1954, 12, 1, 0, 0),
 datetime.datetime(1955, 1, 1, 0, 0),
 datetime.datetime(1955, 2, 1, 0, 0),
 datetime.datetime(1955, 3, 1, 0, 0),
 datetime.datetime(1955, 4, 1, 0, 0),
 datetime.datetime(1955, 5, 1, 0, 0),
 datetime.datetime(1955, 6, 1, 0, 0),
 datetime.datetime(1955, 7, 1, 0, 0),
 datetime.datetime(1955, 8, 1, 0, 0),
 datetime.datetime(1955, 9, 1, 0, 0),
 datetime.datetime(1955, 10, 1, 0, 0),
 datetime.datetime(1955, 11, 1, 0, 0),
 datetime.datetime(1955, 12, 1, 0, 0),
 datetime.datetime(1956, 1, 1, 0, 0),
 datetime.datetime(1956, 2, 1, 0, 0),
 datetime.datetime(1956, 3, 1, 0, 0),
 datetime.datetime(1956, 4, 1, 0, 0),
 datetime.datetime(1956, 5, 1, 0, 0),
 datetime.datetime(1956, 6, 1, 0, 0),
 datetime.datetime(1956, 7, 1, 0, 0),
 datetime.datetime(1956, 8, 1, 0, 0),
 datetime.datetime(1956, 9, 1, 0, 0),
 datetime.datetime(1956, 10, 1, 0, 0),
 datetime.datetime(1956, 11, 1, 0, 0),
 datetime.datetime(1956, 12, 1, 0, 0),
 datetime.datetime(1957, 1, 1, 0, 0),
 datetime.datetime(1957, 2, 1, 0, 0),
 datetime.datetime(1957, 3, 1, 0, 0),
 datetime.datetime(1957, 4, 1, 0, 0),
 datetime.datetime(1957, 5, 1, 0, 0),
 datetime.datetime(1957, 6, 1, 0, 0),
 datetime.datetime(1957, 7, 1, 0, 0),
 datetime.datetime(1957, 8, 1, 0, 0),
 datetime.datetime(1957, 9, 1, 0, 0),
 datetime.datetime(1957, 10, 1, 0, 0),
 datetime.datetime(1957, 11, 1, 0, 0),
 datetime.datetime(1957, 12, 1, 0, 0),
 datetime.datetime(1958, 1, 1, 0, 0),
 datetime.datetime(1958, 2, 1, 0, 0),
 datetime.datetime(1958, 3, 1, 0, 0),
 datetime.datetime(1958, 4, 1, 0, 0),
 datetime.datetime(1958, 5, 1, 0, 0),
 datetime.datetime(1958, 6, 1, 0, 0),
 datetime.datetime(1958, 7, 1, 0, 0),
 datetime.datetime(1958, 8, 1, 0, 0),
 datetime.datetime(1958, 9, 1, 0, 0),
 datetime.datetime(1958, 10, 1, 0, 0),
 datetime.datetime(1958, 11, 1, 0, 0),
 datetime.datetime(1958, 12, 1, 0, 0),
 datetime.datetime(1959, 1, 1, 0, 0),
 datetime.datetime(1959, 2, 1, 0, 0),
 datetime.datetime(1959, 3, 1, 0, 0),
 datetime.datetime(1959, 4, 1, 0, 0),
 ...]
In [119]:
SOIs.index=dateindex
In [120]:
SOIs.head()
Out[120]:
1876-01-01    1.1
1876-02-01    1.0
1876-03-01    0.1
1876-04-01    1.0
1876-05-01    0.8
dtype: float64
In [121]:
SOIs.plot(figsize=(12,5))
Out[121]:
<matplotlib.axes._subplots.AxesSubplot at 0x11d40b550>
In [122]:
pd.rolling_mean(SOIs,12).plot()
/Users/nicolasf/anaconda/anaconda/lib/python3.5/site-packages/ipykernel/__main__.py:1: FutureWarning: pd.rolling_mean is deprecated for Series and will be removed in a future version, replace with 
	Series.rolling(center=False,window=12).mean()
  if __name__ == '__main__':
Out[122]:
<matplotlib.axes._subplots.AxesSubplot at 0x11de76cc0>
Saving in csv, excel etc
In [123]:
type(SOIs)
Out[123]:
pandas.core.series.Series
In [124]:
SOIs = pd.DataFrame(SOIs)
In [125]:
SOIs.to_csv('../data/SOI_time_series.csv')
In [126]:
SOIs.to_excel('../data/SOI_time_series.xlsx', header=False, sheet_name='Sheet1')

first example: an Excel file, containing one sheet, with an Excel dates column

In [127]:
!open ../data/ISO_datetime.xls
In [128]:
data = pd.read_excel('../data/ISO_datetime.xls', sheetname='Sheet1')
In [129]:
data.head()
Out[129]:
date value
0 2014-01-02 0.786299
1 2014-01-03 0.354398
2 2014-01-04 0.747329
3 2014-01-05 0.461564
4 2014-01-06 0.626105
In [130]:
data['date']
Out[130]:
0   2014-01-02
1   2014-01-03
2   2014-01-04
3   2014-01-05
4   2014-01-06
5   2014-01-07
6   2014-01-08
7   2014-01-09
8   2014-01-10
9   2014-01-11
Name: date, dtype: datetime64[ns]
In [131]:
data = pd.read_excel('../data/ISO_datetime.xls', \
                     sheetname='Sheet1', index_col=0)
In [132]:
data.head()
Out[132]:
value
date
2014-01-02 0.786299
2014-01-03 0.354398
2014-01-04 0.747329
2014-01-05 0.461564
2014-01-06 0.626105

correctly parsing date(times) when date and time information are contained in different columns

In [145]:
from datetime import datetime
In [146]:
# !open ../data/year_month_day.xlsx
In [147]:
ymd = pd.read_excel('../data/year_month_day.xlsx', sheetname='Sheet1')
ymd.head()
Out[147]:
year month day value
0 2014 1 2 0.786299
1 2014 1 3 0.354398
2 2014 1 4 0.747329
3 2014 1 5 0.461564
4 2014 1 6 0.626105
In [148]:
ymd.index = ymd[['year', 'month', 'day']].apply(lambda d: datetime(*d), axis = 1)
In [149]:
ymd.head()
Out[149]:
year month day value
2014-01-02 2014 1 2 0.786299
2014-01-03 2014 1 3 0.354398
2014-01-04 2014 1 4 0.747329
2014-01-05 2014 1 5 0.461564
2014-01-06 2014 1 6 0.626105
In [150]:
myd = pd.read_excel('../data/year_month_day.xlsx', sheetname='Sheet2'); myd.head()
Out[150]:
month year day value
0 1 2014 2 0.478467
1 1 2014 3 0.833801
2 1 2014 4 0.837646
3 1 2014 5 0.453646
4 1 2014 6 0.260355
In [151]:
myd.index = myd[['year', 'month', 'day']].apply(lambda d: datetime(*d), axis = 1)
In [152]:
myd.head()
Out[152]:
month year day value
2014-01-02 1 2014 2 0.478467
2014-01-03 1 2014 3 0.833801
2014-01-04 1 2014 4 0.837646
2014-01-05 1 2014 5 0.453646
2014-01-06 1 2014 6 0.260355

dealing with separators in text files

In [153]:
HTML('<iframe src=http://www.jamstec.go.jp/frcgc/research/d1/iod/DATA/emi.weekly.txt width=900 height=200></iframe>')
Out[153]:

You can use regular expressions to specify what delimiters to use.

To know more about regular expressions and their use from Python via the re package, read: http://www.ucs.cam.ac.uk/docs/course-notes/unix-courses/PythonRE/files/PythonRE.pdf

In [154]:
data_weekly = pd.read_table('http://www.jamstec.go.jp/frcgc/research/d1/iod/DATA/emi.weekly.txt', \
                            header=None, sep=r'[:, \s*]', parse_dates={'date':[0,1,2]}, engine='python',\
                            index_col='date', usecols=[0,1,2,4])
In [155]:
data_weekly.columns = ['EMI']
In [156]:
data_weekly.plot();

groupby operations in Pandas

The groupby method is a very powerful method of pandas DataFrames, in a nutschell it allows you to

  1. split your data according to unique values of a variable (or unique combinations of N variables)

  2. apply some operation to the groups thus defined, either an aggregation or transformation method

  3. combine the results into a DataFrame

This process is illustrated below, where the operation is here calculating the mean of the groups's values

A very nice explanation of the groupby method, with examples, is available from Pandas's documentation at:

http://pandas.pydata.org/pandas-docs/stable/groupby.html

and a short tutorial on Wes McKinney's blog here

In [157]:
Image(filename='images/split-apply-combine.png', width=800)
Out[157]:
In [158]:
url = "ftp://ftp.cpc.ncep.noaa.gov/wd52dg/data/indices/ersst3b.nino.mth.81-10.ascii"
In [159]:
#!wget -P ./data ftp://ftp.cpc.ncep.noaa.gov/wd52dg/data/indices/ersst3b.nino.mth.81-10.ascii
In [160]:
data = pd.read_table('../data/ersst3b.nino.mth.81-10.ascii', sep='\s+') #the '\s+' is a regular expression meaning any number of spaces
In [161]:
# if the network confirguration allows it, you can read directly off the URL (ftp):

#data = pd.read_table(url, sep='\s+')
In [162]:
data.tail()
Out[162]:
YR MON NINO1+2 ANOM NINO3 ANOM.1 NINO4 ANOM.2 NINO3.4 ANOM.3
785 2015 6 25.31 2.23 27.89 1.28 29.76 0.92 28.76 1.07
786 2015 7 24.39 2.40 27.44 1.65 29.65 0.85 28.64 1.36
787 2015 8 22.88 1.78 27.05 1.85 29.62 0.90 28.52 1.59
788 2015 9 23.05 2.17 27.21 2.19 29.65 0.93 28.68 1.85
789 2015 10 23.38 2.18 27.29 2.23 29.72 1.00 28.79 2.00

I only keep the raw - monthly - values of NINO 3.4

In [163]:
nino = data[['YR','MON','NINO3.4']]
In [164]:
nino.tail()
Out[164]:
YR MON NINO3.4
785 2015 6 28.76
786 2015 7 28.64
787 2015 8 28.52
788 2015 9 28.68
789 2015 10 28.79

Now I want to calculate a climatology (over the whole period available)

I first group by UNIQUE values of the variable months, I should get 12 groups

In [165]:
groups = nino.groupby('MON')
In [168]:
for month, group in groups:
    print(month)
    print(group.head())
1
      YR  MON  NINO3.4
0   1950    1    24.83
12  1951    1    25.46
24  1952    1    26.85
36  1953    1    26.85
48  1954    1    27.03
2
      YR  MON  NINO3.4
1   1950    2    25.20
13  1951    2    25.78
25  1952    2    26.79
37  1953    2    27.19
49  1954    2    27.22
3
      YR  MON  NINO3.4
2   1950    3    26.03
14  1951    3    26.72
26  1952    3    27.32
38  1953    3    27.68
50  1954    3    27.21
4
      YR  MON  NINO3.4
3   1950    4    26.36
15  1951    4    27.24
27  1952    4    27.88
39  1953    4    28.19
51  1954    4    26.87
5
      YR  MON  NINO3.4
4   1950    5    26.19
16  1951    5    27.68
28  1952    5    27.99
40  1953    5    28.29
52  1954    5    27.07
6
      YR  MON  NINO3.4
5   1950    6    26.52
17  1951    6    27.46
29  1952    6    27.33
41  1953    6    28.02
53  1954    6    26.93
7
      YR  MON  NINO3.4
6   1950    7    26.42
18  1951    7    27.72
30  1952    7    26.72
42  1953    7    27.52
54  1954    7    26.37
8
      YR  MON  NINO3.4
7   1950    8    25.98
19  1951    8    27.36
31  1952    8    26.46
43  1953    8    27.16
55  1954    8    25.73
9
      YR  MON  NINO3.4
8   1950    9    25.78
20  1951    9    27.51
32  1952    9    26.54
44  1953    9    27.13
56  1954    9    25.38
10
      YR  MON  NINO3.4
9   1950   10    25.96
21  1951   10    27.43
33  1952   10    26.54
45  1953   10    27.02
57  1954   10    25.51
11
      YR  MON  NINO3.4
10  1950   11    25.64
22  1951   11    27.48
34  1952   11    26.36
46  1953   11    26.96
58  1954   11    25.67
12
      YR  MON  NINO3.4
11  1950   12    25.50
23  1951   12    27.12
35  1952   12    26.53
47  1953   12    26.99
59  1954   12    25.37
In [169]:
climatology = groups.mean()

Same as

climatology = groups.aggregate(np.mean)
In [170]:
climatology['NINO3.4'].head(12)
Out[170]:
MON
1     26.495455
2     26.686515
3     27.194091
4     27.638485
5     27.756212
6     27.562879
7     27.174545
8     26.791970
9     26.702879
10    26.674545
11    26.608615
12    26.541692
Name: NINO3.4, dtype: float64
In [171]:
f, ax = plt.subplots()

climatology['NINO3.4'].plot(ax=ax, kind='bar',ylim=[26,28], rot=0, width=0.9)

ax.set_xticklabels(list('JFMAMJJASOND'));

f.savefig('./climatology.pdf')

Now suppose we want to apply a function that doesnt aggregate the values in the groups (such as sum, or mean) but rather want to apply a function to those values ...

An example would be calculating the standardized anomalies per month (to each value subtract the mean of the corresponding month, then divide by the standard-deviation)

In [172]:
def zscore(x): 
    z = (x - x.mean()) / x.std()
    return z
In [173]:
nino.head()
Out[173]:
YR MON NINO3.4
0 1950 1 24.83
1 1950 2 25.20
2 1950 3 26.03
3 1950 4 26.36
4 1950 5 26.19
In [174]:
transformed = nino.groupby('MON').apply(zscore)
In [175]:
transformed['NINO3.4'].plot()
Out[175]:
<matplotlib.axes._subplots.AxesSubplot at 0x11eb831d0>

Now we want calculate (just) the anomalies WRT to the climatology, but with a normal established over 1981 - 2010

In [176]:
nino.head()
Out[176]:
YR MON NINO3.4
0 1950 1 24.83
1 1950 2 25.20
2 1950 3 26.03
3 1950 4 26.36
4 1950 5 26.19

we can make use of the query method of Pandas DataFrames to select the climatological period

In [177]:
nino.query('YR >= 1981 & YR <= 2010').head()
Out[177]:
YR MON NINO3.4
372 1981 1 26.17
373 1981 2 26.13
374 1981 3 26.75
375 1981 4 27.32
376 1981 5 27.41
In [178]:
def demean(x): 
    z = x - x.query('YR >= 1981 & YR <= 2010').mean()
    return z
In [179]:
anoms = nino.groupby('MON').apply(demean)
In [180]:
f, ax = plt.subplots(figsize=(10,6))
anoms['NINO3.4'].plot()
data['ANOM.3'].plot() # Should be the same
Out[180]:
<matplotlib.axes._subplots.AxesSubplot at 0x11d4e1940>

Exercise

The file Daily_clim_data_Auckland.csv in the data directory contains daily values for rainfall, minimum and maximum temperatures for Auckland from 1972 to now.

  1. Read the data in a Pandas DataFrame, correctly setting up the index as a datetime object
  2. calculate monthly means for the temperature data, monthly totals for rainfall
  3. calculate and plot a climatology over the period 1981 - 2000 for all parameters
  4. calculate the anomalies WRT this climatology for all parameters
  5. plots the time-series of minimum and maximum temperature
  6. dig into the Scipy documentation to find how to calculate the linear trend over the period for the temperature data
  7. calculate and plot the trend
  8. Contact the New Zealand Climate Science Coalition