SummaryPhenology, the timing of biological events, is an important aspect of environmental systems and phenology models have been in use since the mid 20th century (Chuine & Régnière, 2017). Phenology is a well established field of research and there are numerous model comparison studies which attempt to find the model which best explains a specific phenological event (Basler, 2016;Tang et al., 2016). Many phenology models are well established (Chuine, de Cortazar-Atauri, Kramer, & Hänninen, 2013), yet studies frequently implement a custom codebase to evaluate them. The pyPhenology package attempts to create a common modelling framework which can be used and referenced in phenology research. This will allow other researchers to check the implementation of mathematical models and add new models without rewriting core functionality.pyPhenology has an object oriented API where the same analysis code can be used regardless of the underlying model. The API is inspired by scikit-learn, having fit() and predict() methods for all models (Pedregosa et al., 2011). This allows for easy and reproducible code for phenology model selection and comparison studies. The package implements model fitting using built-in optimizers from the scipy package, allowing end-users to fit models to their data with just a few lines of code (Jones, Oliphant, Peterson, & Others, 2001). A common phenology model requirement is setting certain parameters to fixed values, for example setting the first day for degree day accumulation to January 1. This is done via a simple argument in model initialization. Fitted models can be saved for later use or model parameters exported as a python dictionary for inclusion other analysis. New models can be easily added and must only implement the actual model equations and a checks for adequate explanatory variables. All other requirements, such as fitting, predictions, or model saving, can be inherited from a parent class.The package comes preloaded with several phenology datasets for users to test and learn with. The first is flower and budburst observations of highbush blueberry (Vaccinium corymbosum) from Harvard Forest (O'Keefe, 2015). The second is flower, budburst, and fall senescence observations of aspen (Populus tremuloides) from the U.S.A. National Phenology Network and the many participants who contribute to its Nature's Notebook program (USA National Phenology Network, 2017). Daily mean temperature for all locations represented in the data was obtained from the PRISM dataset (PRISM Climate Group, 2004). pyPhenology was built with large scale analysis in mind and currently drives the continental scale phenology models on http://phenology.naturecast.org.