Python 在计算发生次数后,如何在列表中为每一天创建条目
我在两个单独的csv文件中有两列日期。我正在将它们读入python,并计划在matplotlib中绘图 一种是发票:Python 在计算发生次数后,如何在列表中为每一天创建条目,python,list,date,for-loop,count,Python,List,Date,For Loop,Count,我在两个单独的csv文件中有两列日期。我正在将它们读入python,并计划在matplotlib中绘图 一种是发票: 5/1/2015 5/1/2015 5/1/2015 5/2/2015 5/2/2015 5/2/2015 5/2/2015 5/3/2015 5/3/2015 5/3/2015 5/3/2015 5/4/2015 5/4/2015 5/4/2015 5/4/2015 5/4/2015 5/4/2015 5/5/2015 5/5/2015 5/5/2015 5/5/2015 5/
5/1/2015
5/1/2015
5/1/2015
5/2/2015
5/2/2015
5/2/2015
5/2/2015
5/3/2015
5/3/2015
5/3/2015
5/3/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/4/2015
5/5/2015
5/5/2015
5/5/2015
5/5/2015
5/7/2015
另一个是争议:
5/1/2015
5/1/2015
5/2/2015
5/2/2015
5/3/2015
5/5/2015
5/5/2015
我想用每天的争议数量除以发票数量列一张清单。因此,2015年5月1日的百分比为2/3。2015年5月2日至4日。2015年5月3日为1/4。2015年5月4日是0。2015年5月5日为2/4。2015年5月6日没有发票或争议,因此百分比应为零。因此,列表应该是[.66、.5、.25、0、.5、0、0]
然后我将在y轴上绘制百分比,并将日期作为x轴
我曾尝试使用df.index.day,但后来我得到了每个月第一天、第二天等的组。我使用value_计数来计算每个日期的发生次数,然后在两个列表之间进行划分,但我缺少没有发票或争议的数字,我希望每天都有一个值
有人知道这样做的简单方法吗?获取计数的一个简单方法是使用
集合。计数器:
from collections import Counter
with open('invoice_dates') as f:
invoice_count = Counter(line.strip() for line in f)
对于争议计数
也是如此。然后,您可以获得一个映射日期的字典,以便根据
from __future__ import division # in case you are on Python 2.x
dispute_percentage = {date: dispute_count.get(date, 0) / invoices
for date, invoices in invoice_count.items()}
如果您使用的是Python2.x,请使用iterms()
而不是最后一行中的items()
。您应该更清楚地说明您使用的是pandas
——有内置工具可以帮助您完成您想做的事情。在这种情况下,您可以对f
和f2
使用value\u计数。使用您的示例数据:
>>> f = pd.to_datetime(f)
>>> f2 = pd.to_datetime(f2)
>>> f.value_counts()/f2.value_counts()
2015-05-01 0.666667
2015-05-02 0.500000
2015-05-03 0.250000
2015-05-04 NaN
2015-05-05 0.500000
2015-05-07 NaN
dtype: float64
>>> (f.value_counts()/f2.value_counts()).fillna(0.0)
2015-05-01 0.666667
2015-05-02 0.500000
2015-05-03 0.250000
2015-05-04 0.000000
2015-05-05 0.500000
2015-05-07 0.000000
dtype: float64
谢谢你的回答。这看起来很像蟒蛇,正是我想要的!不幸的是,我的数据集似乎太大了。我得到了这个错误:ValueError:太多的值无法解包。你知道避免这种情况的方法吗?@jenryb:“ValueError:太多的值无法解包”通常是由var1,var2=“value1”,“value2”,“value3”之类的原因造成的。这与您的数据集太大无关,但与您试图将太多的值放入太少的变量(本例中为3到2)无关!看起来这是他代码最后一行的for
的问题。将invoice\u count
替换为invoice\u count.items()
@JakeGriffin,该添加修复了它。但是,输出的所有百分比均为0.0,这是不正确的。现在不匹配,因为日期的格式不同(mm/dd/yyyy与yyyy-mm-dd)。您必须确保争议计数
和发票计数
指令中的键的格式相同,或者当您执行争议计数时。get(date,0)
,它将始终返回默认的0
。如果你在这方面需要帮助,我建议你问一个新问题。谢谢你的回答。这也有助于我的日期格式实际上是不同的。对不起,我没有更清楚地说明我在使用熊猫!