【发布时间】:2018-03-31 23:39:34
【问题描述】:
这是一个简单的问题,起初我认为它很简单。一个小时后,我不太确定!
所以,我有一个 Python datetime 对象列表,我想绘制它们。 x 值是年和月,y 值是该列表中本月发生的日期对象的数量。
也许一个例子会更好地证明这一点(dd/mm/yyyy):
[28/02/2018, 01/03/2018, 16/03/2018, 17/05/2018]
-> ([02/2018, 03/2018, 04/2018, 05/2018], [1, 2, 0, 1])
我的第一次尝试尝试简单地按日期和年份分组,大致如下:
import itertools
group = itertools.groupby(dates, lambda date: date.strftime("%b/%Y"))
graph = zip(*[(k, len(list(v)) for k, v in group]) # format the data for graphing
您可能已经注意到,这将仅按列表中已经存在的日期进行分组。在我上面的例子中,没有一个日期发生在四月的事实会被忽略。
接下来,我尝试查找开始和结束日期,并循环查看它们之间的月份:
import datetime
data = [[], [],]
for year in range(min_date.year, max_date.year):
for month in range(min_date.month, max_date.month):
k = datetime.datetime(year=year, month=month, day=1).strftime("%b/%Y")
v = sum([1 for date in dates if date.strftime("%b/%Y") == k])
data[0].append(k)
data[1].append(v)
当然,这仅在 min_date.month 小于 max_date.month 时才有效,如果它们跨越多年,则不一定如此。此外,它非常丑陋。
有没有一种优雅的方式来做到这一点?
在此先感谢
编辑:需要明确的是,日期是datetime 对象,而不是字符串。为了便于阅读,它们在这里看起来像字符串。
【问题讨论】: