oly*_*ska 5 python datetime pandas
我有两个带有日期时间索引的数据框。
import pandas as pd
d = {'dat': ['2016-01-01', '2016-01-02', '2016-01-03', '2017-01-01', '2017-01-02', '2017-01-03'],'x': [1, 2, 3, 4, 5, 6]}
df1 = pd.DataFrame(d)
df1.set_index(['dat'], inplace=True)
df1.index = pd.to_datetime(df1.index)
d = {'dat': ['2016-01-01', '2017-01-01'],'y': [10, 11]}
df2 = pd.DataFrame(d)
df2.set_index(['dat'], inplace=True)
df2.index = pd.to_datetime(df2.index)
df1:
            x
dat          
2016-01-01  1
2016-01-02  2
2016-01-03  3
2017-01-01  4
2017-01-02  5
2017-01-03  6
df2:
             y
dat           
2016-01-01  10
2017-01-01  11
我想只使用索引的年和月部分加入他们。所以输出将如下所示:
df3:
            x  y
dat          
2016-01-01  1  10 
2016-01-02  2  10
2016-01-03  3  10
2017-01-01  4  11
2017-01-02  5  11
2017-01-03  6  11
我试图加入他们使用
df1.join(df2, how='inner')
我知道我可以像这样提取年份和月份部分:
df1.index.map(lambda x: x.strftime('%Y-%m'))
df2.index.map(lambda x: x.strftime('%Y-%m'))
但我想知道如何将所有这些结合起来达到预期的结果?
非常感谢
您想要合并的信息没有在任何地方明确定义。当我们合并时,没有一个好的方法可以将日期保留在索引中而不破坏它。因此,我们将索引移动到正确的数据框并创建两个新列进行合并。即,year和month。我将这部分包装在一个函数中,以便更好地了解发生了什么。
def f(df):
    df = df.reset_index()
    return df.assign(year=df.dat.dt.year, month=df.dat.dt.month)
df = f(df1).merge(f(df2), on=['year', 'month'], suffixes=['', '_'])
df.set_index('dat')[['x', 'y']]
            x   y
dat              
2016-01-01  1  10
2016-01-02  2  10
2016-01-03  3  10
2017-01-01  4  11
2017-01-02  5  11
2017-01-03  6  11
pd.Index.map这是使用和的不同概念to_period。创建一个字典映射,df2将年/月期间对象转换为 列 中的相应值y。然后用于map将周期日期映射df1.index到正确的y值。
m = dict(zip(df2.index.to_period('M'), df2.y))
df1.assign(y=df1.index.to_period('M').map(m.get))
            x   y
dat              
2016-01-01  1  10
2016-01-02  2  10
2016-01-03  3  10
2017-01-01  4  11
2017-01-02  5  11
2017-01-03  6  11
设置
dates1 = ['2016-01-01', '2016-01-02', '2016-01-03',
          '2017-01-01', '2017-01-02', '2017-01-03']
df1 = pd.DataFrame({'x': range(1, 7)}, pd.DatetimeIndex(dates1, name='dat'))
dates2 = ['2016-01-01', '2017-01-01']
df2 = pd.DataFrame({'y': [10, 11]}, pd.DatetimeIndex(dates2, name='dat'))
| 归档时间: | 
 | 
| 查看次数: | 644 次 | 
| 最近记录: |