Python 蟒蛇2和熊猫:在一个数据框中获取一年中所有的一天
我有大量的行dataframedf\u m,如下所示 我想在dataframe中绘制2010-2017年date_m列的发生天数。由于date_m的年范围是从2010-2017年,有时一天不止一次,比如2010-07-26有两次,所以2010-07-26的出现次数是2次,但有时一天没有数据,比如2010-7-21是0,我想统计一下从2010-2017年开始的一整年中,当这一天在数据框中时,发生的天数,并统计发生次数,当不在数据框中时,发生次数为0,请检查数据框表单如下。最后要计算出年内每月发生的天数,如下图所示 你能给我一些提示怎么做吗,谢谢Python 蟒蛇2和熊猫:在一个数据框中获取一年中所有的一天,python,python-2.7,pandas,dataframe,Python,Python 2.7,Pandas,Dataframe,我有大量的行dataframedf\u m,如下所示 我想在dataframe中绘制2010-2017年date_m列的发生天数。由于date_m的年范围是从2010-2017年,有时一天不止一次,比如2010-07-26有两次,所以2010-07-26的出现次数是2次,但有时一天没有数据,比如2010-7-21是0,我想统计一下从2010-2017年开始的一整年中,当这一天在数据框中时,发生的天数,并统计发生次数,当不在数据框中时,发生次数为0,请检查数据框表单如下。最后要计算出年内每月发生的
db num date_a date_m date_c zip_b zip_a
0 old HKK10032 2010-07-14 2010-07-26 NaT NaN NaN
1 old HKK10109 2011-07-14 2011-09-15 NaT NaN NaN
2 old HNN10167 2012-07-15 2012-08-09 NaT 177-003 NaN
3 old HKK10190 2013-07-15 2013-09-02 NaT NaN NaN
4 old HKK10251 2014-07-16 2014-05-02 NaT NaN NaN
5 old HKK10253 2015-07-16 2015-05-01 NaT NaN NaN
6 old HNN10275 2017-07-16 2017-07-18 2010-07-18 1070062 NaN
7 old HKK10282 2017-07-16 2017-08-16 NaT NaN NaN
8 old HKK10032 2010-07-14 2010-07-26 NaT NaN NaN
9 old HKK10109 2011-07-14 2011-09-15 NaT NaN NaN
....
我想要得到的数据帧表单
2010 2011 2012 2013 2014 2015 2016 2017
1 0 1 0 1 0 2 1 0
2 0 0 0 0 0 0 0 0
3 0 0 1 0 0 2 0 0
4 0 16 14 47 37 37 26 31
5 0 18 11 29 29 24 16 23
6 0 13 8 31 33 24 16 32
7 0 14 31 25 17 21 24 70
8 0 16 25 14 21 27 35 59
9 0 16 10 22 16 31 54 42
10 0 15 11 22 37 48 53 29
11 0 13 10 39 43 41 28 36
12 0 5 7 51 44 30 34 24
13 0 10 13 65 17 30 32 48
14 0 15 26 22 27 31 25 85
15 0 22 22 38 31 30 36 71
16 0 22 19 41 36 33 50 41
17 0 14 19 32 34 43 55 27
18 0 12 17 32 54 37 22 32
19 0 7 14 76 41 32 24 36
20 1 7 22 55 34 30 39 57
21 0 14 39 50 28 26 31 100
22 0 20 32 28 35 30 45 80
23 0 18 19 46 26 31 59 52
24 0 12 20 33 47 59 45 51
25 0 16 22 55 49 48 47 40
26 0 13 17 77 43 40 45 50
27 0 18 33 70 37 39 45 85
28 0 17 34 59 36 46 58 111
29 0 23 27 53 36 39 70 91
30 0 28 37 55 45 52 82 77
.. ... ... ... ... ... ... ... ...
337 19 37 53 40 38 27 55 0
338 29 18 61 25 34 33 69 0
339 18 13 21 27 34 52 54 0
340 17 14 38 33 44 48 48 0
341 14 15 22 48 43 36 38 0
342 13 10 28 49 35 31 36 0
343 12 21 62 33 23 31 43 0
344 20 37 45 29 31 41 45 0
345 15 26 50 19 27 47 76 0
346 24 22 29 27 36 63 71 0
347 16 14 38 43 41 51 33 0
348 13 19 46 52 38 49 34 0
349 22 19 42 46 30 50 49 0
350 17 28 75 54 42 40 42 0
351 22 41 61 34 44 36 44 0
352 23 34 55 42 37 57 79 0
353 30 34 51 45 38 65 81 0
354 25 32 49 57 43 59 61 0
355 22 29 64 50 53 66 62 0
356 24 34 62 54 46 64 66 0
357 19 39 76 47 49 74 79 0
358 29 33 63 44 46 51 83 0
359 28 24 53 38 55 49 82 0
360 26 35 58 46 42 66 63 0
361 27 35 73 32 38 72 70 0
362 21 27 64 42 41 60 66 0
363 23 28 52 47 44 39 61 0
364 16 16 40 27 17 32 67 0
365 0 1 31 0 14 13 38 0
366 0 0 1 0 0 0 17 0
[366 rows x 8 columns]
pandas.DatFrame.groupby和pandas.DatFrame.count可以用作:
代码:
测试代码:
结果:
对于包含零的一年:
要获得一年的零,您可以按以下方式重新编制索引:
counts = df.groupby('date_b').date_b.count()
year = counts.reindex(pd.date_range('2017-01-01', '2017-12-31', freq='D')).fillna(0)
您可以使用:
df1 = df.groupby('date_b')['date_b'].count()
.reindex(pd.date_range('2017-01-01', '2017-12-31', freq='D'), fill_value=0)
编辑:
需要和合计。然后通过以下方式创建新的原始形状:
编辑:需要:
谢谢@Stephen Rauch,如果某一天不在这个数据框中,例如2010-07-25,如何计算它?我想计算一年中的天数,如果该天不在数据框中,则该天数为0。无需计算。您希望最终数据是什么样的?我想绘制2010-2017年全年天数的发生情况,例如:2010年,1-365leap是否为366天,并在数据框中计算天数的发生情况。如果日期不在dataframe中,则发生率为0.yes,但我只想绘制如图所示的格式。感谢@Scott Boston的评论。您能告诉我如何在同一个图中绘制从2010年到2017年的天数吗?如果使用df1.plot,会出现一些问题吗?谢谢@jezrael,如果我使用df1.plot,该图的x轴是2010年、2011年、201220132014年、201520162017年,y轴是每一天的发生次数。实际上,我想画8条线,一条线是一年,例如同一个图中的20102011,x轴是一年中的天或月,y-aixs是出现的数字。好的,现在明白了。给我一些时间。请检查编辑后的答案。如果需要按年份和月份划分的数据帧,请使用MultiIndex.from_product中的df.month和change range代替dt.day。请检查它,我希望我了解您需要什么。
date_b
2010-07-26 2
2011-09-15 2
2012-08-09 1
2013-09-02 1
2014-05-02 1
2015-05-01 1
2017-07-18 1
2017-08-16 1
Name: date_b, dtype: int64
counts = df.groupby('date_b').date_b.count()
year = counts.reindex(pd.date_range('2017-01-01', '2017-12-31', freq='D')).fillna(0)
df.groupby('date_m').date_m.count().reindex(pd.date_range('2010-01-01','2017-12-31',freq='D')).fillna(0)
df1 = df.groupby('date_b')['date_b'].count()
.reindex(pd.date_range('2017-01-01', '2017-12-31', freq='D'), fill_value=0)
#if necessary convert to datetime
df['date_m'] = pd.to_datetime(df['date_m'])
df1 = df.groupby([df['date_m'].dt.year, df['date_m'].dt.day])['date_m'].count()
mux = pd.MultiIndex.from_product([range(2010, 2018), range(1, 32)])
df1 = df1.reindex(mux, fill_value=0)
df1 = df1.unstack(0)
print (df1)
2010 2011 2012 2013 2014 2015 2016 2017
1 0 0 0 0 0 1 0 0
2 0 0 0 1 1 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
9 0 0 1 0 0 0 0 0
10 0 0 0 0 0 0 0 0
11 0 0 0 0 0 0 0 0
12 0 0 0 0 0 0 0 0
13 0 0 0 0 0 0 0 0
14 0 0 0 0 0 0 0 0
15 0 2 0 0 0 0 0 0
16 0 0 0 0 0 0 0 1
17 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 1
19 0 0 0 0 0 0 0 0
20 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0
22 0 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0
25 0 0 0 0 0 0 0 0
26 2 0 0 0 0 0 0 0
27 0 0 0 0 0 0 0 0
28 0 0 0 0 0 0 0 0
29 0 0 0 0 0 0 0 0
30 0 0 0 0 0 0 0 0
31 0 0 0 0 0 0 0 0
df1.plot()
df['date_m'] = pd.to_datetime(df['date_m'])
df1 = df.groupby([df['date_m'].dt.year, df['date_m'].dt.dayofyear])['date_m'].count()
mux = pd.MultiIndex.from_product([range(2010, 2018), range(1, 367)])
df1 = df1.reindex(mux, fill_value=0)
df1 = df1.unstack(0)
print (df1)
2010 2011 2012 2013 2014 2015 2016 2017
1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0
11 0 0 0 0 0 0 0 0
12 0 0 0 0 0 0 0 0
...
...
df1.plot()