【问题标题】:Join Python dataframe time series efficiently有效地加入 Python 数据帧时间序列
【发布时间】:2017-02-05 16:27:51
【问题描述】:

我有以下 2 个数据框:

day
        date     val
11740 2016-01-04  1.3970
11741 2016-01-05  1.3991
11742 2016-01-06  1.4084
11743 2016-01-07  1.4061

df
        Adj_Close         Close        Date          High           Low
182  12927.200195  12927.200195  2016-01-04  12928.900391      12748.50   
181  12920.099609  12920.099609  2016-01-05  12954.900391  12839.799805   
180  12726.799805  12726.799805  2016-01-06  12854.599609  12701.700195   
179  12448.200195  12448.200195  2016-01-07  12661.200195  12439.099609 

我有一个俗气的循环来通过“加入”公共日期来调整日期以创建新的数据框 (new_df)。

new_df = pd.DataFrame(columns=['date', 'close', 'fx', 'usd'])

for indexFx, rowFx in day.iterrows():
    for indexSt, rowSt in df.iterrows(): #this is not efficient 
        fxDate = str(rowFx.date)[:10] #only keep data component not time
        if str(rowSt['Date']) == fxDate:

            dateObj = datetime.strptime(rowSt.Date,'%Y-%m-%d')
            row = [dateObj, rowSt.Close,rowFx.val, float(rowSt.Close) * float(rowFx.val)]
            new_df.loc[len(new_df)] = row

我知道有一种有效的方法来 Pythonize 这个循环。有人可以帮忙吗?

谢谢

【问题讨论】:

  • pd.merge(df, day, left_on='Date', right_on='date')?
  • @MaxU 我试过了,但是结果数据框是空白的,没有数据??
  • 两个 DF 中的日期是否匹配?
  • df.dtypesday.dtypes 的输出是什么?

标签: python pandas dataframe time-series


【解决方案1】:
pd.concat([day.set_index('date'), df.set_index('Date')], axis=1)

>>>

               val     Adj_Close         Close          High  \
2016-01-04  1.3970  12927.200195  12927.200195  12928.900391
2016-01-05  1.3991  12920.099609  12920.099609  12954.900391
2016-01-06  1.4084  12726.799805  12726.799805  12854.599609
2016-01-07  1.4061  12448.200195  12448.200195  12661.200195

                     Low
2016-01-04  12748.500000
2016-01-05  12839.799805
2016-01-06  12701.700195
2016-01-07  12439.099609

根据您需要内部联接还是外部联接,您可以使用join='inner'join='outer' 指定。

【讨论】:

  • 嗯.. 谢谢@vk1011,但第二个数据帧在连接时会导致 NaN。
  • NaN 可能表示日期不匹配,一帧是否包含另一帧缺少的日期?
  • 这是可能的,所以上面的这个循环更好,不能在单独的Pan​​das函数中完成以满足要求
  • 你从哪里得到的 NaN?如果日期不匹配并且您希望保留 NaN 数据点,那么您将执行 outer 连接,否则 inner 连接只会保留两个 DataFrame 共有日期的行并删除任何 NaN。我不确定我理解您所说的“..不能在单独的 Pandas 函数中完成..”是什么意思。
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2021-02-16
  • 2019-11-03
  • 2015-12-21
  • 1970-01-01
  • 2020-11-26
  • 2015-09-28
  • 1970-01-01
相关资源
最近更新 更多