【问题标题】:Combine daily data into monthly data in Excel using Python使用 Python 在 Excel 中将每日数据合并为每月数据
【发布时间】:2015-10-06 19:16:49
【问题描述】:

我试图弄清楚如何将每日日期合并到特定月份,并将特定月份内每一天的数据相加。

注意:我有一个包含每日日期的庞大列表,但我在这里放了一个小样本来简单示例。

文件名:(test.xlsx)

对于一个示例 (sheet1) 包含数据框模式:

       DATE     51      52      53      54      55      56
    0  20110706 28.52   27.52   26.52   25.52   24.52   23.52
    1  20110707 28.97   27.97   26.97   25.97   24.97   23.97
    2  20110708 28.52   27.52   26.52   25.52   24.52   23.52
    3  20110709 28.97   27.97   26.97   25.97   24.97   23.97
    4  20110710 30.5    29.5    28.5    27.5    26.5    25.5
    5  20110711 32.93   31.93   30.93   29.93   28.93   27.93
    6  20110712 35.54   34.54   33.54   32.54   31.54   30.54
    7  20110713 33.02   32.02   31.02   30.02   29.02   28.02
    8  20110730 35.99   34.99   33.99   32.99   31.99   30.99
    9  20110731 30.5    29.5    28.5    27.5    26.5    25.5
   10  20110801 32.48   31.48   30.48   29.48   28.48   27.48
   11  20110802 31.04   30.04   29.04   28.04   27.04   26.04
   12  20110803 32.03   31.03   30.03   29.03   28.03   27.03
   13  20110804 34.01   33.01   32.01   31.01   30.01   29.01
   14  20110805 27.44   26.44   25.44   24.44   23.44   22.44
   15  20110806 32.48   31.48   30.48   29.48   28.48   27.48

我想要编辑 ("test.xlsx",'sheet1') 以产生以下内容:

     DATE    51     52      53      54      55      56
   0 201107  313.46 303.46  293.46  283.46  273.46  263.46
   1 201108  189.48 183.48  177.48  171.48  165.48  159.48

我将如何实现这一点?

到目前为止,这是我的代码:

import pandas as pd
from pandas import ExcelWriter

df = pd.read_excel('thecddhddtestquecdd.xlsx')

def sep_yearmonths(x):
    x['month'] = str(x['DATE'])[:-2]
    return x

df = df.apply(sep_yearmonths,axis=1)

df.groupby('month').sum()

writer = ExcelWriter('thecddhddtestquecddMERGE.xlsx')
df.to_excel(writer,'Sheet1',index=False)
writer.save()

【问题讨论】:

  • 你为什么不单独用excel来做呢?它应该使用python吗?
  • 是的,我正在创建一个程序,该程序会根据与日期范围相关的特定数据自动执行多元线性回归

标签: python excel date pandas


【解决方案1】:

如果 'DATE' 是一列字符串而不是您的索引,这将起作用。

示例数据框 - 为清晰起见缩短:

df = pd.DataFrame({'DATE': {0: '20110706', 1:'20110707', 2: '20110801'}, 
                   52: {0: 28.52, 1: 28.97, 2: 28.52},
                   55: { 0: 24.52, 1: 24.97, 2:24.52 }
                   })

产量:

       52      55   DATE
0   28.52   24.52   20110706
1   28.97   24.97   20110707
2   28.52   24.52   20110801

对数据框应用以下函数以生成新列:

def sep_yearmonths(x):
    x['month'] = x['DATE'][:-2]
    return x

像这样:

df = df.apply(sep_yearmonths,axis=1)

然后您可以对其进行分组和求和:

df.groupby('month').sum()

结果如下:

          52    55
month       
201107  57.49   49.49
201108  28.52   24.52

如果“日期”是您的索引,只需在之前调用reset_index。如果它不是一列字符串值,那么你需要事先这样做。

最后,您可以将“月”列重命名为“日期”。我想您可以就地替换“日期”列,但我选择明确地做事。你可以这样做:

df['DATE'] = df['DATE'].apply(lambda x: x[:-2])

然后是 'groupby' 'DATE' 而不是月份。

【讨论】:

  • 我已尝试实现您的代码并将其添加到上述问题中。我的日期列不是我的索引,但是当我尝试实现该函数时,我得到的是 TypeError ('' 'float' object has no attribute 'getitem'",你'发生在索引 0') 这个似乎在引用 df = df.apply(sep_yearmonths,axis=1)
  • 那是因为您的“日期”列很可能是“浮点”列,而不是字符串。您需要事先将其转换为字符串。尝试用x['month'] = str(x['DATE'])[:2]替换x['month'] = x['DATE'][:2]
  • hmmm 我已经尝试过这个和它正在编译的代码,但它没有合并任何东西。当我打印 df 时,它会产生与代码实现之前完全相同的 df(上图)。也许我错过了什么?
  • 您确定要将 df 替换为调用 apply 的结果吗? Apply 不会就地更改数据框,而是返回它的副本,因此您需要存储它,否则结果是空的......这是唯一想到的事情
  • 我尝试通过df2=df.apply(sep_yearmonths,axis=1) 然后df2=df2.groupby('month').sum() 为应用结果设置一个新的df 之后打印df 将产生与原始df 相同的外观。是否可以测试我的代码并查看可能是什么原因?我目前正在尝试解决为什么此代码未按我想要的方式实现。谢谢
【解决方案2】:

使用resample

import pandas as pd
myTable=pd.read_excel('test.xlsx')
myTable['DATE']=pd.to_datetime(myTable['DATE'], format="%Y%m%d")
myTable=myTable.set_index('DATE')
myTable.resample("M").sum()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2021-01-08
    • 2017-03-26
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    相关资源
    最近更新 更多