Python 如何将两个熊猫数据框放在一起,其中一个数据框缺少日期

Python 如何将两个熊猫数据框放在一起,其中一个数据框缺少日期,python,pandas,Python,Pandas,我在一个数据框中有历史股票行情数据,在另一个数据框中有历史股息数据。它们看起来像这样: Date High Low Open Close Volume Adj Close 0 1993-01-29 43.968750 43.750000 43.968750 43.937500 1003200.0 26.453930 1 1993-02-01 44.250

我在一个数据框中有历史股票行情数据,在另一个数据框中有历史股息数据。它们看起来像这样:

        Date        High        Low         Open        Close       Volume      Adj Close
0       1993-01-29  43.968750   43.750000   43.968750   43.937500   1003200.0   26.453930
1       1993-02-01  44.250000   43.968750   43.968750   44.250000   480500.0    26.642057
2       1993-02-02  44.375000   44.125000   44.218750   44.343750   201300.0    26.698507
3       1993-02-03  44.843750   44.375000   44.406250   44.812500   529400.0    26.980742
4       1993-02-04  45.093750   44.468750   44.968750   45.000000   531500.0    27.093624
... ... ... ... ... ... ... ...
6809    2020-02-13  338.119995  335.559998  335.859985  337.059998  54501900.0  337.059998
6810    2020-02-14  337.730011  336.200012  337.510010  337.600006  64582200.0  337.600006
6811    2020-02-18  337.670013  335.209991  336.510010  336.730011  57226200.0  336.730011
6812    2020-02-19  339.079987  337.480011  337.790009  338.339996  48639100.0  338.339996
6813    2020-02-20  338.640015  333.681702  337.742004  336.894989  63193703.0  336.894989
我想要这样的东西: (我没有1993-03-19年之前的股息数据,但我有1993-03-19年以后的股息数据。)


基本上,我希望合并它们,以便股息列与历史数据框中的日期保持连续。

您可以加入,然后填充缺少的值,最后重命名列

请将您的数据帧命名为
市场价格
股息数据

您可以这样做:

import pandas as pd

# Make sure the keys share type
market_prices['Date'] = pd.to_datetime(market_prices['Date'])
dividend_data.index = pd.to_datetime(dividend_data.index)

# Join the data
prices_with_dividends = market_prices.join(
    dividend_data['value'], how='left', on='Date'
)
# Fill missing values with previous data
prices_with_dividends['value'].fillna(method='ffill', inplace=True)
# Rename column
prices_with_dividends.rename({'value': 'Dividend'}, axis=1, inplace=True)

应该可以了。

您可以加入,然后填充缺少的值,最后重命名列

请将您的数据帧命名为
市场价格
股息数据

您可以这样做:

import pandas as pd

# Make sure the keys share type
market_prices['Date'] = pd.to_datetime(market_prices['Date'])
dividend_data.index = pd.to_datetime(dividend_data.index)

# Join the data
prices_with_dividends = market_prices.join(
    dividend_data['value'], how='left', on='Date'
)
# Fill missing values with previous data
prices_with_dividends['value'].fillna(method='ffill', inplace=True)
# Rename column
prices_with_dividends.rename({'value': 'Dividend'}, axis=1, inplace=True)

应该可以。

假设
df
是包含历史股票数据的数据框,
df2
是包含股息信息的数据框

#先决条件:
df[“日期”]=pd.to_datetime(df[“日期”])
df=df.set_索引(“日期”)
df[“股息”]=df2[“价值”]
df=df.reset_index()

假设
df
是包含历史股票数据的数据框,
df2
是包含股息信息的数据框

#先决条件:
df[“日期”]=pd.to_datetime(df[“日期”])
df=df.set_索引(“日期”)
df[“股息”]=df2[“价值”]
df=df.reset_index()

插补自

如果日期格式不同,请使用以下格式转换:

price_table['Date'] = pd.to_datetime(price_table['Date'])
如果日期格式不同,请使用以下格式转换:

price_table['Date'] = pd.to_datetime(price_table['Date'])


1) 您应该始终以文本而不是图片的形式包含数据。2) 您的预期结果应该与您的样本数据一致。@QuangHoang-明白了!修正了。看看如何使用
pd.DataFrame.merge
1)你应该始终以文本而不是图片的形式包含数据。2) 您的预期结果应该与您的样本数据一致。@QuangHoang-明白了!修复。看看使用
pd.DataFrame.merge
Hm,它应该用于匹配索引-这里可能发生的情况可能是这两个之间的类型不同-即一个日期是
datetime
,另一个是字符串。例如,您可以从
df[“Date”]=pd.to_datetime(df[“Date”])
开始(如果
df2
datetime
索引)不,等等-您可以为两个数据帧共享
df.index.dtype
的结果吗(一旦两个数据帧都有
Date
作为索引)我的坏-单数-它是
df.index.dtype
好-您需要从股票历史数据中更改
日期
-我在上面添加了一行,它们应该是相同的类型(实际上对于所有解决方案,无论是
加入
合并
还是以上)。因此,您可以将它们转换为datetime-s或字符串(
对象
),以确保它们的类型相同。嗯,应该是为了匹配索引-这里可能发生的情况是这两种类型之间的类型不同-即一个日期是
日期时间
,另一个是字符串。例如,您可以从
df[“Date”]=pd.to_datetime(df[“Date”])
开始(如果
df2
datetime
索引)不,等等-您可以为两个数据帧共享
df.index.dtype
的结果吗(一旦两个数据帧都有
Date
作为索引)我的坏-单数-它是
df.index.dtype
好-您需要从股票历史数据中更改
日期
-我在上面添加了一行,它们应该是相同的类型(实际上对于所有解决方案,无论是
加入
合并
还是以上)。因此,您可以将它们转换为datetime-s或字符串(
对象
),以确保它们的类型相同。
TypeError:“非类型”对象不可编辑
在第3行
股息数据['value'],我尝试了如何设置为左
股息数据['Date]=pd.to\u日期时间(股息数据['Date])@jangles,对不起,您需要使用选项
on='Date'
指定要在原始数据帧上使用的键。我会更新我的答案。
TypeError:'NoneType'对象在第3行
divident\u data['value'],how='left'
我尝试了
divident\u data[“Date”]=pd.to\u datetime(divident\u data[“Date”])
@jangles,对不起,您需要使用
on='Date'
选项指定在原始数据框上使用哪个键。我会更新我的答案。
price_table = price_table.merge(dividend_table, left_on = 'Date', right_on ='Date',how = 'outer')
price.value = price.value.fillna('')
price_table['Date'] = pd.to_datetime(price_table['Date'])