【问题标题】:Changing yearly dates to monthly dates and adding new values to populate monthly dates将年度日期更改为月度日期并添加新值以填充月度日期
【发布时间】:2020-02-21 20:14:10
【问题描述】:

我有以下数据框

data = pd.DataFrame({
'date': [1988, 1989, 1990, 1991],
'value': [11558522, 12323552, 13770958, 18412280]
}) 

Out[1]: 
   date     value
0  1988  11558522
1  1989  12323552
2  1990  13770958
3  1991  18412280

然后我将日期列更改为日期时间索引

data['date'] = pd.to_datetime(data['date'],format = '%Y')

Out[2]: 
        date     value
0 1988-01-01  11558522
1 1989-01-01  12323552
2 1990-01-01  13770958
3 1991-01-01  18412280

我将日期列设置为索引

data = data.set_index('date')

Out[3]: 

date          value      
1988-01-01  11558522
1989-01-01  12323552
1990-01-01  13770958
1991-01-01  18412280

现在我想取一个日期值,即 1988 并创建月份(01 到 12)并取该日期的值(11558522)并将其划分为 12 个月。 所以最终我希望数据集看起来像这样

    date          value      
1988-01-01  889117.077
1988-02-01  889117.077
1988-03-01  889117.077
1988-04-01  889117.077
      ...
1988-12-01  889117.077
1989-01-01  947965.538
1989-02-01  947965.538
1989-03-01  947965.538
1989-04-01  947965.538
      ...
1989-12-01  947965.538
etc..

我想为数据框中的每个日期值执行此操作。我怎样才能做到最好?

【问题讨论】:

    标签: python pandas dataframe datetimeindex


    【解决方案1】:

    使用itertools.product 表示所有年份的所有组合,DataFrame.merge 的所有行按原始:

    data = pd.DataFrame({
    'date': [1988, 1989, 1990, 1991],
    'value': [11558522, 12323552, 13770958, 18412280]
    }) 
    
    from  itertools import product
    
    y = data['date']
    m = np.arange(1,13)
    d = [1]
    
    cols = ['year','month','day']
    df = (pd.DataFrame(list(product(y, m, d)), columns=cols)
            .merge(data.rename(columns={'date':'year'}))
            .assign(value = lambda x: x['value'] / 12))
    
    df = df.set_index(pd.to_datetime(df[cols])).drop(cols, axis=1)
    print (df.head())
                        value
    1988-01-01  963210.166667
    1988-02-01  963210.166667
    1988-03-01  963210.166667
    1988-04-01  963210.166667
    1988-05-01  963210.166667
    

    另一个想法是使用字典映射列value 的值创建系列:

    data = pd.DataFrame({
    'date': [1988, 1989, 1990, 1991],
    'value': [11558522, 12323552, 13770958, 18412280]
    }) 
    
    
    from  itertools import product
    
    di = data.set_index('date')['value'].to_dict()
    y = data['date']
    m = np.arange(1,13)
    
    comp = {f'{y}-{m}-01': di.get(y) for y,m,d in product(y, m, d)}
    df = pd.Series(comp).div(12).to_frame('value')
    df.index = pd.to_datetime(df.index)
    print (df.head())
                        value
    1988-01-01  963210.166667
    1988-02-01  963210.166667
    1988-03-01  963210.166667
    1988-04-01  963210.166667
    1988-05-01  963210.166667
    

    【讨论】:

    • 日期有效,但我希望将 1 年的值除以 12。所以在 1989 年,该值是 11558522。我想将此值除以 12,然后就是填充该年月份的新值。即 1988-01-01 到 1988-12-01 的值为 889117.077
    • @Tamarie - 我认为第一个解决方案过于复杂,所以添加更简单,还有除以 12
    • 如果我在我的数据集TypeError: Start and end cannot both be tz-aware with different timezones 上尝试,则会出现以下错误@
    • @Tamarie - 添加原始解决方案,仅添加除以 12
    • 没有工作。仍然收到我之前提到的类型错误。如果我尝试你给出的第一个例子,我会得到这个错误ValueError: cannot assemble the datetimes: time data '-1661174702541897627' does not match format '%Y%m%d' (match)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多