绘制分组日期时间

Rya*_*win 5 python datetime matplotlib pandas

这篇文章有点长,所以这里是最终的“问”:

有没有办法转换结果的 x 轴/索引groupby或将其他类型的参数传递给函数axvspan

我有一个DataFrame带有日期时间列,我已将其分组为yearweekofyear。这工作正常,但 x 轴显示为元组。我想要axvspan,但我不知道该由谁来处理这些元组。

import numpy as np
import pandas as pd
import datetime
from matplotlib import pylab
import matplotlib.pyplot as plt
%matplotlib inline

query = ("https://data.cityofchicago.org/resource/6zsd-86xi.json?$where=year>2010")
raw_data = pd.read_json(query)
Run Code Online (Sandbox Code Playgroud)

以下是 的概述DataFrame。我将在专栏中工作date

raw_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1706960 entries, 0 to 1706959
Data columns (total 22 columns):
arrest                  bool
beat                    int64
block                   object
case_number             object
community_area          float64
date                    datetime64[ns]
description             object
district                float64
domestic                bool
fbi_code                object
id                      int64
iucr                    object
latitude                float64
location                object
location_description    object
longitude               float64
primary_type            object
updated_on              object
ward                    float64
x_coordinate            float64
y_coordinate            float64
year                    int64
dtypes: bool(2), datetime64[ns](1), float64(7), int64(3), object(9)
memory usage: 263.7+ MB
Run Code Online (Sandbox Code Playgroud)

首先,过滤除凶杀案之外的所有犯罪行为。

# get murders
raw_data = raw_data[raw_data["primary_type"] == "HOMICIDE"]

# plot murder count by year and week of the year
plt.figure(figsize=(18, 6))
raw_data.groupby([raw_data.date.dt.year, 
                  raw_data.date.dt.weekofyear])["community_area"].size().plot()
Run Code Online (Sandbox Code Playgroud)

结果图

因此,如您所见,x 轴表示为元组。就像我之前说过的,我想添加一个axvspan来向我的绘图添加任意绿色跨度。如果 x 轴保持其日期时间结构,我可以像这样将值放入函数中,并且它会起作用:

pylab.axvspan(datetime.strptime('2015-12-1 13:40:00', "%Y-%m-%d %H:%M:%S"), 
              datetime.strptime('2016-1-1 13:40:00', "%Y-%m-%d %H:%M:%S"), 
              facecolor='g', alpha=0.05) # green span 
Run Code Online (Sandbox Code Playgroud)

这会将 2015 年 12 月 1 日到 2016 年 1 月 1 日期间的图表显示为绿色。有没有办法转换结果的 x 轴/索引groupby或将其他类型的参数传递给函数axvspan

Rya*_*win 1

好的,我重新整理了用于数据分析的 ole Python副本,并重新发现了该方法,以及一般情况下resample如何很好地处理时间序列数据。pandas下面的代码做到了这一点(坚持我的原始数据集):

# doesn't really matter which column I choose, I just picked one
murders = raw_data["community_area"]
murders.index = raw_data["date"]

plt.figure(figsize=(18, 6))
murders.resample("W-MON").count().plot() # weekly, every Monday

min_date = min(murders.index)
release_date = datetime.strptime('2015-11-24 12:00:00', "%Y-%m-%d %H:%M:%S") 
max_date = max(murders.index)

pylab.axvspan(min_date, 
              release_date, 
              facecolor='g', alpha=0.05) # green span
pylab.axvspan(release_date, 
              max_date, 
              facecolor='r', alpha=0.075) # red span
pylab.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述