使用datetim聚合字典

2024-04-19 03:57:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典WO,格式如下:

WO = {datetime: {'V1', 'V2', 'V3', 'V4'}}

其中datetime是(示例)格式的键:

datetime.date(2014, 6, 20)

V1V4是包含浮动值的列表。你知道吗

示例:

WO = {datetime.date(2014, 12, 20): {'V1': [11, 15, 19], 
                                    'V2': [12, 3, 4], 
                                    'V3': [50, 55, 56], 
                                    'V4': [100, 112, 45]},
      datetime.date(2014, 12, 21): {'V1': [10, 12, 9], 
                                    'V2': [16, 13, 40], 
                                    'V3': [150, 155, 156], 
                                    'V4': [1100, 1132, 457]},
      datetime.date(2014, 12, 22): {'V1': [107, 172, 79], 
                                    'V2': [124, 43, 44], 
                                    'V3': [503, 552, 561], 
                                    'V4': [1000, 1128, 457]}}

如果我想根据给定日期的周将V1V4中的值聚合,例如:

my_date = datetime.date(2014, 5, 23)

对于给定的日期,将V1V4中本周的所有值聚合,其中本周从周一开始。你知道吗

year, week, weekday = datetime.date(my_date).isocalendar()

这行给我这个特定日期的星期和工作日。你知道吗

如果我的职能是:

def week(date):
    '''
    date is in 'datetime.date(year, month, date)' format

    This function is supposed to aggregate values in 'V1', 'V2', 'V3' and 
    'V4' for a whole week according to the parameter 'date'
    '''

接下来如何定义这样的函数?你知道吗


Tags: toin示例datetimedateismy格式
3条回答

据我所知,您希望对给定日期的给定周的所有V1…V4值进行一些操作。 首先,我将首先查找给定日期的星期一(周开始)。你知道吗

year, week, weekday = my_date.isocalendar()     
last_monday_date = my_date - datetime.timedelta(days = weekday - 1)

会给你最后一个星期一的日期。你知道吗

然后您可以将其用于一周内的日期范围: Creating a range of dates in Python

最后,在daterange for循环中,迭代WO值并获得结果。你知道吗

如果我将缺少的大括号添加到WO以消除语法错误(您应该在发布之前检查这些错误):

WO = {datetime.date(2014, 12, 20): {'V1': [11, 15, 19], 'V2': [12, 3, 4], 'V3': [50, 55, 56], 'V4': [100, 112, 45]}, datetime.date(2014, 12, 22): {'V1': [107, 172, 79], 'V2': [124, 43, 44], 'V3': [503, 552, 561], 'V4': [1000, 1128, 457]}, datetime.date(2014, 12, 21): {'V1': [10, 12, 9], 'V2': [16, 13, 40], 'V3': [150, 155, 156], 'V4': [1100, 1132, 457]}}

然后我可以这样做来查看数据中的周数:

>>> for date, values in WO.items():
        year, week, _ = date.isocalendar()
        print (date,year,week)

我可以看到,在这个例子中,有两个星期,你要合计:

2014-12-20 2014 51
2014-12-22 2014 52
2014-12-21 2014 51

也就是说,您的数据与ISO 2014年第51周和第52周有关。您正在按周进行合并,因此聚合的数据将有一个键(year, week),但没有日期。(您需要年份,因为您的数据中可能有不同的年份。)因此您希望使用键(2014, 51)(2014, 52)构建一个dict。一个人将有3个与"V1"-"V4"相关的值,因为那一周只有一天,没有什么可巩固的。另一周将有6个值与"V1"-"V4"关联,因为数据中该周有两天。你知道吗

从空的dict开始包含摘要:

>>> summary = {}

像以前一样遍历日期以查找年份和周数,但这次根据(year, week)键收集数据:

>>> for date, values in WO.items():
      year, week, _ = date.isocalendar()
      if (year, week) not in summary:
        summary [(year, week)] = {vn: [] for vn in values} # empty lists for vn = 'V1' - 'V4'
      for vn in values:
        summary[(year, week)][vn].extend(values[vn])

>>> summary
{(2014, 51): {'V1': [11, 15, 19, 10, 12, 9], 'V2': [12, 3, 4, 16, 13, 40], 'V3': [50, 55, 56, 150, 155, 156], 'V4': [100, 112, 45, 1100, 1132, 457]}, (2014, 52): {'V1': [107, 172, 79], 'V2': [124, 43, 44], 'V3': [503, 552, 561], 'V4': [1000, 1128, 457]}}

您可以使用嵌套的defaultdict从同一周收集数据,使用周数作为键(或其他一些可哈希标识符)。然后使用嵌套字典理解来对列表元素进行求和。你知道吗

from collections import defaultdict

dd = defaultdict(lambda: defaultdict(list))

for k1, v1 in WO.items():
    for k2, v2 in v1.items():
        dd[k1.isocalendar()[1]][k2].append(v2)

WO_agg = {k1: {k2: list(map(sum, zip(*v2))) for k2, v2 in v1.items()} \
          for k1, v1 in dd.items()}

print(WO_agg)
# {51: {'V1': [21, 27, 28],
#       'V2': [28, 16, 44],
#       'V3': [200, 210, 212],
#       'V4': [1200, 1244, 502]},
#  52: {'V1': [107, 172, 79],
#       'V2': [124, 43, 44],
#       'V3': [503, 552, 561],
#       'V4': [1000, 1128, 457]}}

相关问题 更多 >