【问题标题】:How do I count the number of times a date shows up in a list?如何计算日期在列表中出现的次数?
【发布时间】:2015-07-24 01:57:54
【问题描述】:

所以我遇到了问题。我正在尝试创建一个脚本来查看 ArcMap 中的图层(我们使用 10.2.2)创建一个 csv 文件,该文件的最终输出将包含技术人员的姓名和他们在特定日期查看的区域数量.为此,我认为我需要创建一个特定于每个技术人员的字典,并将日期作为键,将出现的次数作为值。

这就是我卡住的地方。如何创建一个统计日期出现次数的字典?

到目前为止,我已经包含了我的代码,但我不知道该去哪里,或者我什至在正确的轨道上。此外,我不确定如何使用我需要的所有三列(名称、日期、计数)制作 csv 文件。

import arcpy, datetime
from arcpy import mapping
from datetime import datetime

# pass layer to script
mxd = mapping.MapDocument("C:\\Users\\eschlueter\\Desktop\\test\\test.mxd")
layers = mapping.ListLayers(mxd)

inLayer = layers[0]
csvfilename = "C:\\Users\\eschlueter\\Desktop\\test\\test1.csv"

# Create the search cursor
cursor = arcpy.SearchCursor(inLayer)

##define a dictionary of every technician
elizabethtech = {}
unknowntech = {}

##create a counter for each technician's contracts
Elizabethcontract = 0
Unknowncontract = 0

##Define Variables and Iterate through the rows in cursor
desc = arcpy.Describe(inLayer)
fields =  desc.fields
for field in fields:
    for srow in cursor:
        tech = srow.getValue("Technician")
        ModDate = srow.getValue("ModifiedDate")
        if tech == "Elizabeth Schlueter":
            Elizabethcontract = Elizabethcontract + 1
            ESList = []
            ES = {}
            FormDate = ModDate.strftime("%m-%d-%Y")
            print FormDate
            ESList.append(FormDate)
            c = ESList.count(FormDate)
            ES[FormDate] = c
            print ES

我真的可以在这方面使用一些帮助!谢谢你们提前帮助我!

更新

我已经能够使用 Counter 和 .update 方法创建字典,并创建了所有技术人员的主列表作为键,值是(日期,计数)。我现在如何获取这本字典并打印一个 csv 文件?我希望文件包含技术人员姓名、日期和日期计数。这可能吗?

【问题讨论】:

  • 嗨,伊丽莎白,欢迎来到 stackoverflow!您可以通过将示例代码减少到重现问题所需的最低限度来改进您的问题。请在帮助中心阅读“How to create a Minimal, Complete, and Verifiable example”。另外,看看PEP8,python 程序员对命名和格式约定非常敏感。

标签: python csv counting arcpy


【解决方案1】:

查看 collections 包中的 Counter 类。这是一种字典,其中键是日期(在您的情况下),值是该日期发生次数的累积计数。因此,为每个员工创建一个 Counter 而不是字典。在解析数据时,您会收集每个员工的新日期并将它们添加到 Counter(请参阅 Counter.update)。

from collections import Counter
dates = ['5-11-15','5-12-15','5-11-15']
c = Counter()
c.update(dates) 
print(c)

这打印: 计数器({'5-11-15': 2, '5-12-15': 1})

【讨论】:

  • 我尝试过类似的方法,但我认为我做得不对。我多次输入相同的条目而不是计数。例如,我会让它打印计数器,它会说 5-11-2015 : 1 多次。你认为你可以通过给我一个编码样本来帮助我吗?计数器对我来说是新的。 :)
  • 另外,我认为如何获取计数器字典并将其转换,以便我可以打印带有日期和计数以及技术人员姓名的 csv?
  • 我添加了一个短代码sn-p。我不知道为什么你不能让它工作——这很简单。您要计算的对象到底是什么?它们是字符串还是其他具有更复杂行为的对象?为了让计数器为您工作,当您希望两个对象表示相同的日期时,它们必须比较相等。
  • Coubters 具有与字典相同的语义,因此您可以使用 items() 遍历它们的元素(假设 Python 3)。然后你以你想要的任何格式打印键和值。
猜你喜欢
  • 2016-01-09
  • 2019-06-18
  • 1970-01-01
  • 2021-09-09
  • 2019-06-06
  • 2021-07-29
  • 2012-07-12
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多