根据具体日期按季分组数据

时间:2017-06-13 16:11:26

标签: python-2.7 pandas pandas-groupby

我有一个包含4年数据的csv文件,我试图在4年内每个季节对数据进行分组,不同的说法,我需要总结并将我的整个数据绘制到4个赛季。 这是我的数据文件:

@test.score = 0 if @test.score.nil?

这是我想要的输出:

timestamp,heure,lat,lon,impact,type
2006-01-01 00:00:00,13:58:43,33.837,-9.205,10.3,1
2006-01-02 00:00:00,00:07:28,34.5293,-10.2384,17.7,1
2007-02-01 00:00:00,23:01:03,35.0617,-1.435,-17.1,2
2007-02-02 00:00:00,01:14:29,36.5685,0.9043,36.8,1
2008-01-01 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1
2008-01-02 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1
....
2011-12-31 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1

其实我已经尝试过这段代码:

winter     (the mean value of impacts)
summer     (the mean value of impacts)
autumn      ....
spring      .....

我得到了这个可怕的结果:  enter image description here

我错了哪里?

3 个答案:

答案 0 :(得分:4)

<强> pandas.cut
为了在一年的开始和结束时正确处理'Winter',我将dayofyear移到了11,并将结果模数为366。我不使用与numpy解决方案中相同的技术的原因是pd.cut返回分类类型,我最终会得到5个类别,其中两个类别具有相同的标签。然后我可以将结果转换为字符串,但这感觉很草率。

data['SEASON'] = pd.cut(
    (data.index.dayofyear + 11) % 366,
    [0, 91, 183, 275, 366],
    labels=['Winter', 'Spring', 'Summer', 'Fall']
)

<强> numpy.searchsorted
为了在年初和年末正确处理'Winter',我允许'Winter'

两个分档
seasons = np.array(['Winter', 'Spring', 'Summer', 'Fall', 'Winter'])
f = np.searchsorted([80, 172, 264, 355], data.index.dayofyear)
data['SEASON'] = seasons[f]

plot

data.groupby('SEASON')['impact'].mean().plot.bar()

enter image description here

答案 1 :(得分:2)

看起来像:

data['SEASON'] = data.index.to_series().dt.**month**.map(lambda x : season(x))

使用的月份大概是1-12或0-11,这些都是“冬天”。 你需要使用一年中的这一天。

但你可能更容易看到这一点,并且如果你没有把一天中的提取物锁定在一个单行内,就可以打印自己检查。只是说。

答案 2 :(得分:2)

您需要DatetimeIndex.dayofyear

data['SEASON'] = data.index.dayofyear.map(season)

pandas.cut的另一个解决方案:

bins = [0, 91, 183, 275, 366]
labels=['Winter', 'Spring', 'Summer', 'Fall']
doy = data.index.dayofyear
data['SEASON1'] = pd.cut(doy + 11 - 366*(doy > 355), bins=bins, labels=labels)