首页 > 解决方案 > Python matplotlib 成条形图

问题描述

我有 2 个 python 文件和 1 个 csv 文件。

我正在尝试从每个国家/地区收集 2000 年至 2009 年的所有访客并选择前 3 个国家,因为它将显示前 3 个国家/地区的条形图

我遇到的错误是:

Traceback (most recent call last):
  File "C:/ASP/pythonProjectDA_YODA/main.py", line 3, in <module>
    countries=Countries("2000","2009","China","Japan")
  File "C:\ASP\pythonProjectDA_YODA\countries.py", line 8, in __init__
    dfVisitor.index=pd.to_datetime(dfVisitor.index)
  File "C:\Users\65965\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\tools\datetimes.py", line 812, in to_datetime
    result = convert_listlike(arg, format, name=arg.name)
  File "C:\Users\65965\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\tools\datetimes.py", line 459, in _convert_listlike_datetimes
    result, tz_parsed = objects_to_datetime64ns(
  File "C:\Users\65965\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pandas\core\arrays\datetimes.py", line 2044, in objects_to_datetime64ns
    result, tz_parsed = tslib.array_to_datetime(
  File "pandas\_libs\tslib.pyx", line 352, in pandas._libs.tslib.array_to_datetime
  File "pandas\_libs\tslib.pyx", line 579, in pandas._libs.tslib.array_to_datetime
  File "pandas\_libs\tslib.pyx", line 718, in pandas._libs.tslib.array_to_datetime_object
  File "pandas\_libs\tslib.pyx", line 552, in pandas._libs.tslib.array_to_datetime
TypeError: <class 'tuple'> is not convertible to datetime

我不知道这意味着什么,因为这仍然是我第一次学习这个。

main.py 文件代码如下:

**from countries import Countries
countries=Countries("ListedCountries.csv","2000","2009","China","Japan")
countries.top3()
countries.drawchart()**

Another Python file is stated below as well :

**import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
class Countries:
  def __init__(self,syear,eyear,scountries,ecountries):
      dfVisitor=pd.read_csv("ListedCountries.csv")
      dfVisitor.index=pd.to_datetime(dfVisitor.index)
      dfVisitor.columns=dfVisitor.colums.str.strip()
      dfOther=dfVisitor.loc[syear:eyear, scountries:ecountries]
      dfOtherTotal=dfOther.sum()
      self.dfOtherTotalSorted=dfOtherTotal.sort_values(ascending=False)
      print(self.dfOtherTotalSorted)
  def top3(self):
      value=self.dfOtherTotalSorted.to_dict()
      c=1
      print("Top 3 countries in the region over a span of 10 years")
      for x, y in value.items():
          if c<=3:
              print(c,x,y)
              c+=1 #c=c+1
      if len(value)>0:
          return True
      else:
          return False
  def drawchart(self):
      ps=self.dfOtherTotalSorted
      index=np.arrange(len(ps.index))
      plt.xlabel("No. of Visitors in 10 years visit Singapore",fontsize=10)
      plt.ylabel((1000000, 2000000, 3000000, 4000000), fontsize=15)
      plt.xticks(index,ps.index,fontsize=15, rotation=90)
      plt.title("Total visitors from 2000 to 2009 in Singapore")
      plt.bar(ps.index,ps.values)
      plt.show()**

最后我有的是 CSV.file :

**Japan,HongKong,China,Taiwan,Korea
 2000 Jan,72,131,16,288,38,887,19,329,32,621
 2000 Feb,71,245,28,265,45,148,30,528,28,932
 2000 Mar,91,844,21,513,30,644,22,934,30,682
 2000 Apr,60,540,29,308,36,511,27,737,27,237
 2000 May,62,152,20,822,37,934,23,635,30,739
 2000 Jun,67,977,22,011,30,706,26,582,25,318
 2000 Jul,84,634,30,218,36,148,35,570,32,960
 2000 Aug,101,785,31,963,41,162,30,732,34,877
 2000 Sep,89,417,20,566,31,239,19,824,23,207
 2000 Oct,73,383,21,512,35,195,17,685,28,185
 2000 Nov,80,889,21,326,32,999,17,034,31,169
 2000 Dec,73,898,22,183,37,762,19,314,28,426
 2001 Jan,65,381,27,778,56,460,20,418,32,727
 2001 Feb,72,335,18,442,36,157,20,078,32,777
 2001 Mar,85,655,27,025,30,320,16,438,32,441
 2001 Apr,58,348,25,816,37,542,19,756,30,150
 2001 May,58,984,19,806,41,999,16,381,28,842
 2001 Jun,64,582,23,752,31,882,19,445,26,914
 2001 Jul,76,373,24,929,45,570,25,185,34,830
 2001 Aug,92,508,28,515,51,208,21,981,35,899
 2001 Sep,69,850,20,024,34,386,15,218,23,526
 2001 Oct,35,970,19,363,42,586,14,259,24,125
 2001 Nov,32,294,18,583,41,208,15,219,29,452
 2001 Dec,43,483,22,124,48,080,17,709,27,400
 2002 Jan,47,447,16,630,50,303,18,995,38,613
 2002 Feb,49,583,26,760,81,649,21,463,30,745
 2002 Mar,68,549,24,043,42,728,16,038,38,393
 2002 Apr,49,149,21,771,63,880,17,554,32,704
 2002 May,50,563,23,490,56,486,16,570,27,807
 2002 Jun,54,892,22,965,41,186,17,251,27,519
 2002 Jul,66,566,26,488,51,147,25,238,32,353
 2002 Aug,85,655,26,513,62,699,22,147,39,236
 2002 Sep,77,884,18,914,47,217,13,553,21,472
 2002 Oct,58,489,21,025,57,693,15,730,28,827
 2002 Nov,54,294,17,425,56,422,11,981,28,758
 2002 Dec,60,338,19,941,58,683,12,796,24,591
 2003 Jan,53,131,17,336,62,454,15,826,34,976
 2003 Feb,50,469,24,563,89,704,17,940,32,707
 2003 Mar,54,497,16,460,54,063,11,498,25,186
 2003 Apr,12,501,4,808,23,002,2,531,2,890
 2003 May,7,056,5,510,3,994,1,283,2,552
 2003 Jun,14,051,16,426,8,405,5,412,8,477
 2003 Jul,28,636,29,541,20,989,18,298,25,714
 2003 Aug,43,016,34,391,52,847,19,466,30,591
 2003 Sep,47,623,17,839,57,716,13,190,20,942
 2003 Oct,38,418,19,234,56,700,14,982,24,175
 2003 Nov,37,630,18,368,67,541,12,271,29,059
 2003 Dec,47,021,21,778,71,068,12,233,24,125
 2004 Jan,39,191,22,763,79,717,17,014,30,255
 2004 Feb,43,760,17,189,50,903,13,918,29,835
 2004 Mar,53,022,18,564,53,481,13,060,25,853
 2004 Apr,38,801,24,158,75,068,13,484,26,713
 2004 May,43,714,23,922,70,021,13,963,31,482
 2004 Jun,44,112,21,679,63,014,15,181,29,912
 2004 Jul,56,066,27,380,92,649,21,955,35,568
 2004 Aug,66,617,30,887,90,212,19,708,38,602
 2004 Sep,62,264,19,562,62,134,13,542,25,956
 2004 Oct,51,340,21,884,70,449,13,840,26,936
 2004 Nov,48,066,19,317,88,223,12,747,31,623
 2004 Dec,51,858,24,381,84,369,14,030,28,344
 2005 Jan,48,004,17,457,45,801,16,774,20,386
 2005 Feb,40,310,28,713,61,601,19,104,24,531
 2005 Mar,52,225,31,089,52,249,15,669,23,476
 2005 Apr,41,599,23,614,68,775,16,345,28,923
 2005 May,43,968,25,187,62,872,16,019,28,927
 2005 Jun,43,020,23,843,61,150,16,710,32,366
 2005 Jul,49,791,35,295,93,889,27,702,42,961
 2005 Aug,61,522,38,649,101,134,22,950,42,791
 2005 Sep,57,085,23,649,67,061,15,670,25,572
 2005 Oct,49,532,22,996,74,501,17,754,30,060
 2005 Nov,50,402,20,552,88,704,14,094,31,277
 2005 Dec,50,994,22,770,79,945,15,123,32,803
 2006 Jan,45,402,23,587,81,734,19,898,40,604
 2006 Feb,44,695,22,743,96,562,17,723,40,835
 2006 Mar,62,353,21,726,91,092,16,227,36,144
 2006 Apr,41,269,28,836,97,423,17,657,31,780
 2006 May,42,907,24,008,78,594,15,410,34,236
 2006 Jun,43,153,23,998,71,213,17,393,36,327
 2006 Jul,52,407,28,265,113,127,27,109,45,685
 2006 Aug,62,970,30,672,103,459,23,438,44,846
 2006 Sep,51,284,20,463,63,550,15,350,29,315
 2006 Oct,47,552,21,801,70,690,17,087,35,025
 2006 Nov,52,047,22,845,88,343,15,953,43,791
 2006 Dec,48,367,22,530,81,414,16,218,36,134
 2007 Jan,49,959,19,559,76,116,17,156,46,756
 2007 Feb,46,920,26,025,111,934,23,307,31,464
 2007 Mar,58,843,22,361,79,239,16,091,42,071
 2007 Apr,37,962,29,338,99,136,15,343,32,219
 2007 May,38,813,25,261,85,198,14,952,34,408
 2007 Jun,41,289,25,551,77,239,16,868,38,027
 2007 Jul,49,234,31,990,108,881,24,849,46,123
 2007 Aug,58,288,32,177,114,463,21,028,45,910
 2007 Sep,54,186,22,902,76,181,16,276,30,265
 2007 Oct,51,825,23,224,83,831,14,426,33,383
 2007 Nov,53,784,22,638,103,906,13,742,43,965
 2007 Dec,53,411,21,084,97,832,14,118,39,701
 2008 Jan,52,973,19,817,108,486,16,342,50,432
 2008 Feb,47,449,27,263,121,031,17,829,40,998
 2008 Mar,57,364,27,600,98,180,13,778,39,683
 2008 Apr,36,301,20,232,107,639,13,944,33,946
 2008 May,42,382,22,867,86,785,14,276,36,412
 2008 Jun,40,879,23,055,70,565,13,146,35,998
 2008 Jul,47,659,28,218,105,528,19,398,39,614
 2008 Aug,53,699,26,847,91,325,16,923,42,338
 2008 Sep,48,771,20,765,66,582,12,303,25,914
 2008 Oct,47,736,20,016,76,836,13,503,30,930
 2008 Nov,48,225,19,197,79,096,12,535,24,445
 2008 Dec,47,602,22,238,66,689,11,947,22,308
 2009 Jan,38,382,23,399,105,144,15,986,25,516
 2009 Feb,42,807,19,720,80,037,12,744,27,387
 2009 Mar,46,797,21,290,91,275,12,542,20,759
 2009 Apr,31,633,28,587,86,525,11,970,21,323
 2009 May,29,800,21,529,52,058,11,602,21,854
 2009 Jun,28,060,21,703,41,650,11,486,20,991
 2009 Jul,46,633,33,382,72,326,17,351,30,389
 2009 Aug,50,698,36,218,86,530,17,490,32,332
 2009 Sep,52,561,21,509,59,588,10,443,15,714
 2009 Oct,43,247,25,512,83,273,13,208,16,069
 2009 Nov,38,949,20,525,90,358,11,900,19,620
 2009 Dec,40,420,21,046,87,983,10,039,20,033
112,551,37,334,126,870,29,368,52,654**

标签: python

解决方案


在您消除 CSV 文件中的嵌入逗号后,此代码有效。另一个问题是您试图打印“中国”:“日本”,但您的列的顺序不是这样。它必须是“日本”:“中国”。您还有几个拼写错误(列、排列)。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

class Countries(object):
    def __init__(self,filename,syear,eyear,scountries,ecountries):
        dfVisitor=pd.read_csv(filename)
        dfVisitor = dfVisitor.set_index('Date')
        dfVisitor.index=pd.to_datetime(dfVisitor.index)
        dfOther=dfVisitor.loc[syear:eyear, scountries:ecountries]
        dfOtherTotal=dfOther.sum()
        self.dfOtherTotalSorted=dfOtherTotal.sort_values(ascending=False)
        print(self.dfOtherTotalSorted)
    def top3(self):
        value=self.dfOtherTotalSorted.to_dict()
        print("Top 3 countries in the region over a span of 10 years")
        for x, y in list(value.items())[:3]:
            print(x,y)
    def drawchart(self):
        ps=self.dfOtherTotalSorted
        index=np.arange(len(ps.index))
        plt.xlabel("No. of Visitors in 10 years visit Singapore",fontsize=10)
        plt.ylabel((1000000, 2000000, 3000000, 4000000), fontsize=15)
        plt.xticks(index,ps.index,fontsize=15, rotation=90)
        plt.title("Total visitors from 2000 to 2009 in Singapore")
        plt.bar(ps.index,ps.values)
        plt.show()

countries=Countries("ListedCountries.csv",pd.to_datetime("2000-01-01"),pd.to_datetime("2009-12-31"),"Japan","China")
countries.top3()
countries.drawchart()

推荐阅读