Python 从日期列表中计算每个月的天数

Python 从日期列表中计算每个月的天数,python,datetime,python-datetime,Python,Datetime,Python Datetime,如何从python中的日期列表中计算当前年份每个月的天数。考虑一下我有一个日期列表如下: 10/Mar/2016 06:39:31 16/Nov/2015 06:16:27 16/Dec/2012 06:39:31 16/Dec/2015 06:16:27 9/Mar/2016 06:16:27 15/Nov/2015 06:16:27 15/Mar/2012 06:39:31 15/Nov/2015 06:16:27 15/Sep/2015 06:16:27 15/Jan/2015 06:16

如何从python中的日期列表中计算当前年份每个月的天数。考虑一下我有一个日期列表如下:

10/Mar/2016 06:39:31
16/Nov/2015 06:16:27
16/Dec/2012 06:39:31
16/Dec/2015 06:16:27
9/Mar/2016 06:16:27
15/Nov/2015 06:16:27
15/Mar/2012 06:39:31
15/Nov/2015 06:16:27
15/Sep/2015 06:16:27
15/Jan/2015 06:16:27
16/Feb/2016 06:16:27
16/Jan/2016 06:39:31
16/Feb/2016 06:39:31
15/Feb/2012 06:16:27
12/Mar/2016 06:16:27
16/Nov/2012 06:16:27
8/Jan/2016 06:16:27
10/Mar/2016 06:39:31
16/Nov/2012 06:39:31
16/Nov/2012 06:16:20
7/Mar/2016 06:16:27
15/Nov/2012 06:16:27
16/Jan/2016 06:16:27
16/Oct/2015 06:39:31
现在我要的是1月3日、2月2日、3月5日等等

我试过了

from datetime import datetime as date_for_conv
if(times> date_for_conv.strptime(times, "%d/%b/%Y %H:%M:%S").strftime("2016/Jan/%d")):
    jan+=1

times
是循环中迭代的列表元素。这只给出了1月份的计数,我想在单个条件检查中进行。我该怎么办?

假设您的数据在data.txt中,这将以相当高效的方式完成(无需将所有内容读入内存并对其进行排序)。最近,我对itertools和collections有点着迷,主要是因为它们能让事情变得更快,但它也更像是python。关于它们如何工作的参考文档留给读者作为练习

from itertools import imap
from collections import defaultdict

counters = defaultdict(int)
with open('data.txt', 'r') as fp:
    lines = iter(fp.readline, '')
    mos = imap(lambda s: s.split('/')[1], lines)
    for mo in mos:
        counters[mo] += 1

for m, c in counters.items():
    print "{}: {}".format(m, c)
编辑:我意识到你也有一个要求,如果一个月没有日期,那么你也希望列出这些日期。为此,您可以导入
日历
模块,但您将遇到与区域设置有关的问题。因此,最好简单地循环12个月:

for m in ('Jan', 'Feb', ...):
    print "{}: {}".format(m, counters.get(m, 0))

假设您的数据在data.txt中,这将以相当有效的方式完成(无需将所有内容读入内存并对其进行排序)。最近,我对itertools和collections有点着迷,主要是因为它们能让事情变得更快,但它也更像是python。关于它们如何工作的参考文档留给读者作为练习

from itertools import imap
from collections import defaultdict

counters = defaultdict(int)
with open('data.txt', 'r') as fp:
    lines = iter(fp.readline, '')
    mos = imap(lambda s: s.split('/')[1], lines)
    for mo in mos:
        counters[mo] += 1

for m, c in counters.items():
    print "{}: {}".format(m, c)
编辑:我意识到你也有一个要求,如果一个月没有日期,那么你也希望列出这些日期。为此,您可以导入
日历
模块,但您将遇到与区域设置有关的问题。因此,最好简单地循环12个月:

for m in ('Jan', 'Feb', ...):
    print "{}: {}".format(m, counters.get(m, 0))

一个简单的计数方法是使用字典。添加新键并增加(如果存在):

from datetime import datetime
times = ['10/Mar/2016 06:39:31','16/Nov/2015 06:16:27','16/Dec/2012 06:39:31','16/Dec/2015 06:16:27',
         '9/Mar/2016 06:16:27','15/Nov/2015 06:16:27','15/Mar/2012 06:39:31','15/Nov/2015 06:16:27',
         '15/Sep/2015 06:16:27','15/Jan/2015 06:16:27','16/Feb/2016 06:16:27','16/Jan/2016 06:39:31',
         '16/Feb/2016 06:39:31','15/Feb/2012 06:16:27','12/Mar/2016 06:16:27','16/Nov/2012 06:16:27',
         '8/Jan/2016 06:16:27','10/Mar/2016 06:39:31','16/Nov/2012 06:39:31','16/Nov/2012 06:16:20',
         '7/Mar/2016 06:16:27','15/Nov/2012 06:16:27','16/Jan/2016 06:16:27','16/Oct/2015 06:39:31']

counters = {}
for t in times:
    month = datetime.strptime(t, "%d/%b/%Y %H:%M:%S").strftime('%b')
    if month in counters:
        counters[month] += 1
    else:
        counters[month] = 1

for k,v in counters.items():
    print('{}-{}'.format(k,v))
这将返回:

Oct-1
Dec-2
Mar-6
Jan-4
Feb-3
Sep-1
Nov-7

一个简单的计数方法是使用字典。添加新键并增加(如果存在):

from datetime import datetime
times = ['10/Mar/2016 06:39:31','16/Nov/2015 06:16:27','16/Dec/2012 06:39:31','16/Dec/2015 06:16:27',
         '9/Mar/2016 06:16:27','15/Nov/2015 06:16:27','15/Mar/2012 06:39:31','15/Nov/2015 06:16:27',
         '15/Sep/2015 06:16:27','15/Jan/2015 06:16:27','16/Feb/2016 06:16:27','16/Jan/2016 06:39:31',
         '16/Feb/2016 06:39:31','15/Feb/2012 06:16:27','12/Mar/2016 06:16:27','16/Nov/2012 06:16:27',
         '8/Jan/2016 06:16:27','10/Mar/2016 06:39:31','16/Nov/2012 06:39:31','16/Nov/2012 06:16:20',
         '7/Mar/2016 06:16:27','15/Nov/2012 06:16:27','16/Jan/2016 06:16:27','16/Oct/2015 06:39:31']

counters = {}
for t in times:
    month = datetime.strptime(t, "%d/%b/%Y %H:%M:%S").strftime('%b')
    if month in counters:
        counters[month] += 1
    else:
        counters[month] = 1

for k,v in counters.items():
    print('{}-{}'.format(k,v))
这将返回:

Oct-1
Dec-2
Mar-6
Jan-4
Feb-3
Sep-1
Nov-7

因为没有2016年3月的日期对不起,报名的人很少。为什么投反对票?我可以看到2016年3月有两个日期——从名单底部的第四个和第七个。2016年3月10日、2016年3月9日、2016年3月12日、2016年3月7日,没有2016年3月的日期?请重新编辑您的问题。因为没有2016年3月的日期。对不起,没有多少条目。为什么投反对票?我可以看到2016年3月的两个日期-从列表底部的第四个和第七个。2016年3月10日、2016年3月9日、2016年3月12日、2016年3月7日,没有2016年3月的日期?请重新编辑你的问题。实际上我有一个文本文件,但除了日期还有其他内容。如果只有日期,我就可以按你的方式来做。但我也参考了你的答案来解决问题。尝试使用字典和计数器实现。实际上我有一个文本文件,但除了日期还有其他内容。如果只有日期,我就可以按你的方式来做。但我也参考了你的答案来解决问题。正在尝试使用字典和计数器实现。非常感谢:)这正是我想要的。你节省了很多时间。。。再次感谢!!!非常感谢:)正是我想要的。你节省了很多时间。。。再次感谢!!!