我正在寻找一种更加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进行迭代的过程,以自动确定地块数量(及其适当的分割)为目标,我不会反对。
答案 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。