按日期范围分隔matplotlib子图

时间:2019-06-10 15:54:21

标签: python pandas datetime matplotlib

我正在寻找一种更加Python化的方法,将一个大地块分成几个子图,并按月(2月,3月等)分隔

我已使用

将df中的所有日期值转换为DateTime。
pd.to_datetime(df['dates']

然后,我成功地根据所需的日期范围创建了包含数据框切片的新变量,但这似乎不是最有效/可重复的方法。我最初的想法是使用datetime()在x轴上设置一个限制,并为所需的日期范围传递两个参数。仍然效率不高,但是我的初始数据集只有五个月。

plt.figure(1)
plt.subplot(511)
plt.plot(x['dates'], y, marker='o')
plt.xticks(rotation='vertical')
plt.rcParams['figure.figsize'] = (30,10)
plt.xlabel('time')
plt.ylabel('day-over-day change')
plt.xlim([datetime.date.strftime(2019, 2, 1), 
datetime.date.strftime(2019, 2, 28)])
plt.show()

我期待一个小的子图,其中包含介于2/1/2019和2/28/2019之间的所有数据点,但是当我运行此代码时,出现类型错误,显示为:

TypeError: descriptor 'strftime' requires a 'datetime.date' object but 
received a 'int'

编辑:我也尝试过

plt.xlim([datetime.date(2019, 2, 1), datetime.date(2019, 2, 26)])

但是会产生错误:

TypeError: datetime.date(2019, 2, 1) is not a string

这就是为什么我尝试使用'strftime'

结束编辑

同时自动创建正确数量的子图是理想的选择,因为现在我只想通过matplotlib.pyplot()传递正确的参数,这样我就可以使客户更容易理解数据。如果有人想解决通过df进行迭代的过程,以自动确定地块数量(及其适当的分割)为目标,我不会反对。

1 个答案:

答案 0 :(得分:1)

您当前使用的strftime使用的输入不正确。 strftime()使用日期对象并将其转换为字符串。相反,请尝试datetime.date(Y, M, D)

此外,您可以使用熊猫的一些内置功能,将时间数组编入索引并将其分成不同的时间区域。具体来说,Grouper()功能允许按常用时间属性(如月,周,年)对日期时间列进行分组。以下是一些示例代码,它们生成一个数据框,然后将其每个月拆分为单独的数据框:

import datetime
import pandas as pd

dates = []
values = []

for i in range(1,12):
    for j in range(1, 10):
        dates.append(datetime.date(2019, i, j))
        values.append(i*j)

pd_time = pd.to_datetime(dates)

data = {"timestamp": pd_time, "values": values}
df = pd.DataFrame(data)
months = [g for n, g in df.set_index('timestamp').groupby(pd.Grouper(freq='M'))]

查看结果months显示:

>>> months
[            values
timestamp
2019-01-01       1
2019-01-02       2
2019-01-03       3
2019-01-04       4
2019-01-05       5
2019-01-06       6
2019-01-07       7
2019-01-08       8
2019-01-09       9,             values
timestamp
2019-02-01       2
2019-02-02       4
2019-02-03       6
2019-02-04       8
2019-02-05      10
2019-02-06      12
2019-02-07      14
2019-02-08      16
2019-02-09      18,             values
...

有关按日期范围划分时间序列的信息,请参见此SO thread