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'])