【问题标题】:groupby and aggregate for a certain range of months (Nov-June)groupby 和聚合一定范围的月份(11 月至 6 月)
【发布时间】:2019-01-23 17:36:55
【问题描述】:

我有一个数据集如下:

       time             Value
2006-09-15 00:00:00      1.27
2006-09-16 00:00:00        0
2006-09-17 00:00:00        0
2006-09-18 00:00:00     1.016
2006-09-19 00:00:00      5.08
2006-09-20 00:00:00      0.16
2006-09-21 00:00:00      3.81

我想知道哪种方法最适合在 11 月到 6 月而不是日历年执行 groupby.sum。

【问题讨论】:

  • 你能举一个你尝试过的例子吗?
  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只在发布者已经尝试单独解决问题时提供帮助。展示这种努力的一个好方法是添加Minimal, complete, verifiable example。在发帖前检查你完成的intro tour,尤其是How to Ask
  • "Can Someone Help Me?" is not a valid SO question。这通常表明您需要的是与当地导师相处或完成教程,而不是 Stack Overflow。

标签: python pandas datetime


【解决方案1】:

假设您的时间列是datetime64[ns],您只需按月份过滤数据框并求和即可。根据您的问题,您不关心按年份分组。

# create sample dataframe
df = pd.DataFrame({'Value': {0: 1.27, 1: 0.0, 2: 0.0, 3: 1.016, 4: 5.08, 5: 0.16, 6: 3.81},
 'time': {0: '2006-09-15 00:00:00',
  1: '2006-11-16 00:00:00',
  2: '2006-11-17 00:00:00',
  3: '2006-12-18 00:00:00',
  4: '2006-01-19 00:00:00',
  5: '2006-02-20 00:00:00',
  6: '2006-09-21 00:00:00'}})

# make sure column is datetime
df['time'] = pd.to_datetime(df['time'])

# filter by month using .isin()
df[df['time'].apply(lambda x: x.month).isin([11,12,1,2,3,4,5,6])]['Value'].sum()

或者,如果您想对该范围内的年份和月份进行分组,则需要添加年份和月份列并对其进行分组:

# create sample dataframe
df = pd.DataFrame({'Value': {0: 1.27, 1: 1.0, 2: 1.06, 3: 1.016, 4: 5.08, 5: 0.16, 6: 3.81},
 'time': {0: '2006-09-15 00:00:00',
  1: '2006-11-16 00:00:00',
  2: '2006-11-17 00:00:00',
  3: '2006-12-18 00:00:00',
  4: '2006-01-19 00:00:00',
  5: '2006-02-20 00:00:00',
  6: '2007-02-21 00:00:00'}})

# make sure time is in fact datetime
df['time'] = pd.to_datetime(df['time'])

# create month and year columns to group on
df['Month'] = df['time'].map(lambda x: x.month)
df['Year'] = df['time'].map(lambda x: x.year)

# filter dataframe for your month range
df2 = df[df['Month'].isin([11,12,1,2,3,4,5,6])]

# groupby and sum value
df2.groupby(['Year','Month'])['Value'].sum()

【讨论】:

  • 我有一个非常大的数据集,是否需要创建示例数据框?
  • @gooner2018 示例数据集仅用于示例。您提供的示例将返回一个空数据框,因为所有月份都是 9 月并且超出了 11 月至 6 月的范围
  • 我的意思是给每条记录分配 0,1,2,.. 是不可能的,因为我有一个大数据集。
  • @gooner2018 您没有使用循环分配月份和年份,创建新列并使用 lambda 函数映射信息不会花费很长时间。
  • @gooner2018 只需在您的数据帧上运行来自df['time'] = pd.to_datetime(df['time']) 的代码,它就会工作
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多