我有以下数据框:
Date abc xyz
01-Jun-13 100 200
03-Jun-13 -20 50
15-Aug-13 40 -5
20-Jan-14 25 15
21-Feb-14 60 80
我需要按年和月分组数据。即:按2013年1月、2013年2月、2013年3月等分组...我将使用新分组的数据来创建一个显示每年/每月abc vs xyz的图表。
我尝试过groupby和sum的各种组合,但似乎没有任何效果。
谢谢你的帮助。
有不同的方法可以做到这一点。
df = pd.DataFrame({'Date':['01-Jun-13','03-Jun-13', '15-Aug-13', '20-Jan-14', '21-Feb-14'],
abc:[100,-20,40,25,60], xyz:[200,50,-5,15,80]})
def getMonth(s):
return s.split("-")[1]
def getDay(s):
return s.split("-")[0]
def getYear(s):
return s.split("-")[2]
def getYearMonth(s):
return s.split("-")[1]+"-"+s.split("-")[2]
year
、month
、day
和“yearMonth
”。在你的情况下,你需要两者中的一个。您可以使用两列对“年”、“月”进行分组,也可以使用一列对“年”、“月”进行分组df['year']= df['Date'].apply(lambda x: getYear(x))
df['month']= df['Date'].apply(lambda x: getMonth(x))
df['day']= df['Date'].apply(lambda x: getDay(x))
df['YearMonth']= df['Date'].apply(lambda x: getYearMonth(x))
输出:
Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
2 15-Aug-13 40 -5 13 Aug 15 Aug-13
3 20-Jan-14 25 15 14 Jan 20 Jan-14
4 21-Feb-14 60 80 14 Feb 21 Feb-14
在本例中,我们按两列分组:
for key,g in df.groupby(['year','month']):
print key,g
输出:
('13', 'Jun') Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
('13', 'Aug') Date abc xyz year month day YearMonth
2 15-Aug-13 40 -5 13 Aug 15 Aug-13
('14', 'Jan') Date abc xyz year month day YearMonth
3 20-Jan-14 25 15 14 Jan 20 Jan-14
('14', 'Feb') Date abc xyz year month day YearMonth
在本例中,我们按一列进行分组:
for key,g in df.groupby(['YearMonth']):
print key,g
输出:
Jun-13 Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
Aug-13 Date abc xyz year month day YearMonth
2 15-Aug-13 40 -5 13 Aug 15 Aug-13
Jan-14 Date abc xyz year month day YearMonth
3 20-Jan-14 25 15 14 Jan 20 Jan-14
Feb-14 Date abc xyz year month day YearMonth
4 21-Feb-14 60 80 14 Feb 21 Feb-14
get\u group
打印df.groupby(['YearMonth'])。get_group('Jun-13')
输出:
Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
get\u组
。这种方法有助于过滤值并获得分组值这也会产生同样的结果。
print df[df['YearMonth']=='Jun-13']
输出:
Date abc xyz year month day YearMonth
0 01-Jun-13 100 200 13 Jun 01 Jun-13
1 03-Jun-13 -20 50 13 Jun 03 Jun-13
您可以在2013年6月期间选择abc
或xyz
值列表
print df[df['YearMonth']=='Jun-13'].abc.values
print df[df['YearMonth']=='Jun-13'].xyz.values
输出:
[100 -20] #abc values
[200 50] #xyz values
你可以用它来浏览你归类为“年月”的日期,并在上面应用cretiria来获取相关数据。
for x in set(df.YearMonth):
print df[df['YearMonth']==x].abc.values
print df[df['YearMonth']==x].xyz.values
我建议也检查一下这个答案。
为什么不简单点?!
GB=DF.groupby([(DF.index.year),(DF.index.month)]).sum()
给你,
print(GB)
abc xyz
2013 6 80 250
8 40 -5
2014 1 25 15
2 60 80
然后你可以用,
GB.plot('abc','xyz',kind='scatter')
您可以使用重采样或Grouper
(在引擎盖下重采样)。
首先确保datetime列实际上是datetimes(用pd.to\u datetime
点击它)。如果是DatetimeIndex,则更容易:
In [11]: df1
Out[11]:
abc xyz
Date
2013-06-01 100 200
2013-06-03 -20 50
2013-08-15 40 -5
2014-01-20 25 15
2014-02-21 60 80
In [12]: g = df1.groupby(pd.Grouper(freq="M")) # DataFrameGroupBy (grouped by Month)
In [13]: g.sum()
Out[13]:
abc xyz
Date
2013-06-30 80 250
2013-07-31 NaN NaN
2013-08-31 40 -5
2013-09-30 NaN NaN
2013-10-31 NaN NaN
2013-11-30 NaN NaN
2013-12-31 NaN NaN
2014-01-31 25 15
2014-02-28 60 80
In [14]: df1.resample("M", how='sum') # the same
Out[14]:
abc xyz
Date
2013-06-30 40 125
2013-07-31 NaN NaN
2013-08-31 40 -5
2013-09-30 NaN NaN
2013-10-31 NaN NaN
2013-11-30 NaN NaN
2013-12-31 NaN NaN
2014-01-31 25 15
2014-02-28 60 80
注意:以前的pd.Grouper(freq=“M”)
被写成pd.TimeGrouper(“M”)
。后者现在从0.21开始就被弃用了。
我原以为下面的方法行得通,但是行不通(由于as_index
不被尊重?我不确定。)。为了利息,我把这个包括在内。
如果它是一个列(必须是datetime64列!如我所说,用点击它以\u datetime
),您可以使用PeriodIndex:
In [21]: df
Out[21]:
Date abc xyz
0 2013-06-01 100 200
1 2013-06-03 -20 50
2 2013-08-15 40 -5
3 2014-01-20 25 15
4 2014-02-21 60 80
In [22]: pd.DatetimeIndex(df.Date).to_period("M") # old way
Out[22]:
<class 'pandas.tseries.period.PeriodIndex'>
[2013-06, ..., 2014-02]
Length: 5, Freq: M
In [23]: per = df.Date.dt.to_period("M") # new way to get the same
In [24]: g = df.groupby(per)
In [25]: g.sum() # dang not quite what we want (doesn't fill in the gaps)
Out[25]:
abc xyz
2013-06 80 250
2013-08 40 -5
2014-01 25 15
2014-02 60 80
为了得到期望的结果,我们必须重新索引。。。
问题内容: 我有以下数据框: 我需要按年份和月份对数据进行分组。例如:按2013年1月,2013年2月,2013年3月等分组。我将使用新分组的数据创建一个显示每年/每月abc vs xyz的图表。 我已经尝试了groupby和sum的各种组合,但是似乎什么也无法工作。 感谢您的协助。 问题答案: 您可以使用重采样或(在后台重采样)。 首先,请确保datetime列实际上是datetimes(用命中
有没有一个简单的方法可以做到这一点?
问题内容: 我正在处理Java作业,它涉及在用户指定月份和年份之后打印日历。我不能使用Calendar或GregorianCalendar类。我的问题是日历在星期六的第一天无法正确打印月份。我已经看了大约一个小时的代码,但不确定出什么问题。我正在使用Zeller的Congruence查找以“ h”表示的每月的第一天。 例如,2008年3月的日历(错误地)如下所示: 这是我的代码: 问题答案: 从星
我的数据类型是格式化为“yyyy-mon-dd”的日期,我希望提取要格式化为“mon yyyyy”的月份和年份,同时将数据类型保留为date,以便能够与ADD_MONTHS函数一起使用。有办法这样做吗?我从名为date_process的数据字段中提取日期。
问题内容: 如何在SELECT中查找一年中的第一天? 我找到了这个月份-但是我没有足够的掌握年份的信息:(我一直在寻找一个单独的查询来查找月份开始和现在之间的数据) 问题答案: 我认为您需要: 老实说,您可以执行以下操作:
我在利用这一刻。js以特定的形式显示时间- 上面的代码以下面的格式显示日期和时间 0年0月1天37小时 我需要展示这样的东西 0年0月1天13小时 我已经尝试使用from现在和from https://momentjs.com/docs/#/displaying/from/ 但无法获得输出。我怎样才能做到这一点。