【问题标题】:Data frame manipulation with Date使用日期操作数据框
【发布时间】:2017-05-13 04:06:59
【问题描述】:

我有 2 个数据框如下:

df1:

       id       Grade         Date
1      78        15        2016-05-23
2      99        12        2015-08-01

df2:

                 rate
2015-01-01       1.22
2015-02-01       1.12
   ...
2015-05-01       1.05
2017-01-01       1.33

我想将 df1 中的等级乘以 df2 中同月的比率。 所以对于 2016 年 5 月 23 日,它是在第 5 个月,因为我会在 1.05 之前将它加倍。

有什么建议吗? 谢谢你的帮助

【问题讨论】:

  • df2可以有多个同月的案例吗?如果df2 中出现两个不同年份的同一个月份怎么办?预期输出的最终形式是什么?到目前为止,您尝试了哪些无效的方法?

标签: python date pandas datetime


【解决方案1】:

如果您将 df2 索引设置为每月PeriodIndex

In [11]: df2.index = df2.index.to_period("M")

In [12]: df2
Out[12]:
         rate
2015-01  1.22
2015-02  1.12
2016-05  1.32
2015-08  1.23

现在,您可以使用df2.loc 有效地提取费率:

In [13]: df2.loc[df1.Date.dt.to_period("M")]["rate"]
Out[13]:
2016-05    1.32
2015-08    1.23
Freq: M, Name: rate, dtype: float64

现在,你可以乘法了:

In [14]: df2.loc[df1.Date.dt.to_period("M")]["rate"].values * df1["Grade"]
Out[14]:
1    19.80
2    14.76
Name: Grade, dtype: float64


In [21]: df1["NormedGrade"] = df2.loc[df1.Date.dt.to_period("M")]["rate"].values * df1["Grade"]

In [22]: df1
Out[22]:
   id  Grade       Date  Normed Grade
1  78     15 2016-05-23         19.80
2  99     12 2015-08-01         14.76

【讨论】:

  • 谢谢你成功了!还有一个问题,如果 df2 日期索引是四分之一频率,我应该改变什么?
  • @hdatas .dt.to_period("Q")
【解决方案2】:

设置

df1
Out[903]: 
   id  Grade       Date
1  78     15 2016-05-23
2  99     12 2015-08-01

df2
Out[904]: 
        Date  rate
0 2015-01-01  1.22
1 2015-02-01  1.12
2 2015-05-01  1.05
3 2017-01-01  1.33

解决方案

#extract month from date and put it in a new column
df1['month'] = df1.Date.apply(lambda x: x.month)
df2['month'] = df2.Date.apply(lambda x: x.month)
#merge two dfs to get the rate
df3 = pd.merge(df1,df2,how='left',on='month')
#multiply grade by its rate.
df3['Grade_rate'] = df3.Grade*df3.rate
df3
Out[897]: 
   id  Grade     Date_x  month     Date_y  rate  Grade_rate
0  78     15 2016-05-23      5 2015-05-01  1.05       15.75
1  99     12 2015-08-01      8        NaT   NaN         NaN

【讨论】:

    【解决方案3】:

    如果您只能依靠 df2 中的一个月的一个实例,这是一个可行的解决方案:

    首先,根据 OP 的示例生成示例数据。
    请注意,df2 中的第一个日期已更改,以展示两个不同月份数字的功能。

    df1 = pd.DataFrame([[78, 15, "2016-05-23"],
                        [99, 12, "2015-08-01"]], 
                       columns=['id', 'Grade', 'Date'])
    
    df2 = pd.DataFrame([["2015-08-01", 1.22],
                        ["2015-02-01", 1.12],
                        ["2015-05-01", 1.05],
                        ["2017-01-01", 1.33]],
                      columns=['Date','rate'])
    

    现在从每个DataFrame 中提取月份数字并保存为新列:

    df1['month_num'] = pd.to_datetime(df1.Date).dt.month
    df2['month_num'] = pd.to_datetime(df2.Date).dt.month
    

    最后,计算df1.Grade 和关联的rate 的乘积:

    df1['Grade_X_rate'] = df1.Grade.multiply(df1.merge(df2[['month_num','rate']], 
                                                       on="month_num", 
                                                       how="left").rate
                                            )
    
       id  Grade        Date  month_num  Grade_X_rate
    0  78     15  2016-05-23          5         15.75
    1  99     12  2015-08-01          8         14.64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多