【问题标题】:Merge two Panda DataFrames - Problem: Different Formats on Date合并两个 Panda DataFrames - 问题:日期格式不同
【发布时间】:2022-01-01 21:11:35
【问题描述】:

我有以下两个数据集:

df_ff.head()
Out[382]: 
     Date  Mkt-RF   SMB   HML    RF
0  192607    2.96 -2.38 -2.73  0.22
1  192608    2.64 -1.47  4.14  0.25
2  192609    0.36 -1.39  0.12  0.23
3  192610   -3.24 -0.13  0.65  0.32
4  192611    2.53 -0.16 -0.38  0.31

df_ibm.head()
Out[384]: 
        Date        Open        High  ...       Close   Adj_Close     Volume
0 2012-01-01  178.518158  184.608032  ...  184.130020  128.620193  115075689
1 2012-02-01  184.713196  190.468445  ...  188.078400  131.378296   82435156
2 2012-03-01  188.556412  199.923523  ...  199.474182  139.881134   92149356
3 2012-04-01  199.770554  201.424469  ...  197.973236  138.828659   90586736
4 2012-05-01  198.068832  199.741867  ...  184.416824  129.322250   89961544

关于日期变量的类型,我们有以下几点:

df_ff.dtypes
Out[383]: 
Date        int64 

df_ibm.dtypes
Out[385]: 
Date         datetime64[ns]

我想合并(用 SQL 语言:“内连接”)这两个数据集,因此正在编写:

testMerge = pd.merge(df_ibm, df_ff, on = 'Date')

这会产生错误:

ValueError: You are trying to merge on datetime64[ns] and int64 columns. If you wish to proceed you should use pd.concat

由于日期变量的格式不同,此合并不起作用。关于如何解决这个问题的任何提示?我的第一个想法是翻译格式的日期(在 df_ff 数据集中): “192607”转换为“1926-07-01”格式,但我没能做到。

【问题讨论】:

  • int64 日期的格式是什么? (即YYYY-MM-DD 符号中的192607 是什么)?
  • 192608 是什么意思? 2019-08-26?
  • 隐式假设是第一天,所以192607应该是:1926-07-01 @BrokenBenchmark。
  • 1926-07-02 将如何用这种表示法表示?
  • 不会,我们只有月度数据,所以我们总是假设它是每个月的第一天。 @BrokenBenchmark

标签: python pandas merge


【解决方案1】:

使用pd.to_datetime:

df['Date2'] = pd.to_datetime(df['Date'].astype(str), format="%Y%m")
print(df)

# Output
     Date      Date2
0  192607 1926-07-01
1  192608 1926-08-01
2  192609 1926-09-01
3  192610 1926-10-01
4  192611 1926-11-01

【讨论】:

  • 如您所愿吗?
【解决方案2】:

第一步转换为datetime64[ns],并协调Date列:

df_ff['Date'] = pd.to_datetime(df_ff['Date'].astype(str), format='%Y%m')

然后将它们转换为索引(因为它更有效):

df_ff = df_ff.set_index('Date')
df_ibm = df_ibm.set_index('Date')

终于pd.merge两个pd.DataFrame

out = pd.merge(df_ff, df_ibm, left_index=True, right_index=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2019-09-14
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2020-07-23
    • 2021-02-28
    相关资源
    最近更新 更多