Python 如何使用不同的datetimeindex将值从一个数据帧填充到另一个数据帧

Python 如何使用不同的datetimeindex将值从一个数据帧填充到另一个数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧。一个是5分钟粒度(df1),另一个是按天索引(df2)。为了这个例子,一天的结束时间是7:10 df1: df2: 现在,我想从df2的“range”列中获取值,并将它们重复注入df1的一个新列中 应该是这样的: Date Close range 2019-06-20 07:00:00 2927.25 115.0 2019-06-20 07:05:00 2927.00 115.0 2019-06-20 07:10:00 2

我有两个数据帧。一个是5分钟粒度(df1),另一个是按天索引(df2)。为了这个例子,一天的结束时间是7:10

df1:

df2:

现在,我想从df2的“range”列中获取值,并将它们重复注入df1的一个新列中

应该是这样的:

            Date    Close       range
2019-06-20 07:00:00 2927.25     115.0
2019-06-20 07:05:00 2927.00     115.0
2019-06-20 07:10:00 2926.75     115.0
2019-06-21 07:00:00 2932.25     86.0    
2019-06-21 07:05:00 2932.25     86.0    
2019-06-21 07:10:00 2931.00     86.0    
2019-06-24 07:00:00 2941.75     52.0
2019-06-24 07:05:00 2942.25     52.0
2019-06-24 07:10:00 2941.50     52.0
2019-06-25 07:00:00 2925.50     132.0
2019-06-25 07:05:00 2926.50     132.0
2019-06-25 07:10:00 2926.50     132.0
不幸的是,我不知道如何开始,这就是为什么没有“我的尝试”代码
如何执行此操作?

首先将类似日期的列转换为日期时间序列:

df1['Date'] = pd.to_datetime(df1['Date'])
df2.index = pd.to_datetime(df2.index)
使用+将
范围
值从
df2
映射到
df1

df1['range'] = df1['Date'].dt.date.map(df2.set_index(df2.index.date)['range'])
或者也可以使用:

结果:

                  Date    Close  range
0  2019-06-20 07:00:00  2927.25  115.0
1  2019-06-20 07:05:00  2927.00  115.0
2  2019-06-20 07:10:00  2926.75  115.0
3  2019-06-21 07:00:00  2932.25   86.0
4  2019-06-21 07:05:00  2932.25   86.0
5  2019-06-21 07:10:00  2931.00   86.0
6  2019-06-24 07:00:00  2941.75   52.0
7  2019-06-24 07:05:00  2942.25   52.0
8  2019-06-24 07:10:00  2941.50   52.0
9  2019-06-25 07:00:00  2925.50  132.0
10 2019-06-25 07:05:00  2926.50  132.0
11 2019-06-25 07:10:00  2926.50  132.0

如果要进行循环,请执行以下操作:

for i in df2["Date"]:
     for j in df1["Date"]:
          if i==j:
              df1['range'] = df2['range']
  • 需要确保日期列是日期
  • 将它们细化到日常粒度,以便它们在数据帧中保持一致
  • 清理列
  • 输出

                         Date    Close  range
    2019-06-19 23:00:00+00:00  2927.25    115
    2019-06-19 23:05:00+00:00  2927.00    115
    2019-06-19 23:10:00+00:00  2926.75    115
    2019-06-20 23:00:00+00:00  2932.25     86
    2019-06-20 23:05:00+00:00  2932.25     86
    2019-06-20 23:10:00+00:00  2931.00     86
    2019-06-23 23:00:00+00:00  2941.75     52
    2019-06-23 23:05:00+00:00  2942.25     52
    2019-06-23 23:10:00+00:00  2941.50     52
    2019-06-24 23:00:00+00:00  2925.50    132
    2019-06-24 23:05:00+00:00  2926.50    132
    2019-06-24 23:10:00+00:00  2926.50    132
    

    作为一个建议,我可以说看看pandas中的merge函数,因为它看起来像是您所追求的:
    series.map
    解决方案在range列中写入NaN值。
    DataFrame.merge
    解决方案不起作用。错误:“'RangeIndex'对象没有属性'date'”@stanvooz您首先需要将日期列转换为pandas datetime系列。我这样做了,但随后数据帧看起来有点奇怪,我收到一条警告,此外,范围列还有NaN值:
    /opt/anaconda3/lib/python3.7/site packages/pandas/core/restrape/merge.py:617:UserWarning:不同级别之间的合并可能会产生意外结果(左侧1个级别,右侧2个级别)警告。warn(msg,UserWarning)
                      Date    Close  range
    0  2019-06-20 07:00:00  2927.25  115.0
    1  2019-06-20 07:05:00  2927.00  115.0
    2  2019-06-20 07:10:00  2926.75  115.0
    3  2019-06-21 07:00:00  2932.25   86.0
    4  2019-06-21 07:05:00  2932.25   86.0
    5  2019-06-21 07:10:00  2931.00   86.0
    6  2019-06-24 07:00:00  2941.75   52.0
    7  2019-06-24 07:05:00  2942.25   52.0
    8  2019-06-24 07:10:00  2941.50   52.0
    9  2019-06-25 07:00:00  2925.50  132.0
    10 2019-06-25 07:05:00  2926.50  132.0
    11 2019-06-25 07:10:00  2926.50  132.0
    
    for i in df2["Date"]:
         for j in df1["Date"]:
              if i==j:
                  df1['range'] = df2['range']
    
    df1 = pd.DataFrame({"Date":["2019-06-19T23:00:00.000Z","2019-06-19T23:05:00.000Z","2019-06-19T23:10:00.000Z","2019-06-20T23:00:00.000Z","2019-06-20T23:05:00.000Z","2019-06-20T23:10:00.000Z","2019-06-23T23:00:00.000Z","2019-06-23T23:05:00.000Z","2019-06-23T23:10:00.000Z","2019-06-24T23:00:00.000Z","2019-06-24T23:05:00.000Z","2019-06-24T23:10:00.000Z"],"Close":[2927.25,2927,2926.75,2932.25,2932.25,2931,2941.75,2942.25,2941.5,2925.5,2926.5,2926.5]})
    df2 = pd.DataFrame({"Date":["2019-06-19T16:00:00.000Z","2019-06-20T16:00:00.000Z","2019-06-23T16:00:00.000Z","2019-06-24T16:00:00.000Z"],"range":[115,86,52,132]})
    
    df1.Date = pd.to_datetime(df1.Date)
    df2.Date = pd.to_datetime(df2.Date)
    
    
    df1.assign(day=df1.Date.dt.floor("D"))\
        .merge(df2.assign(day=df2.Date.dt.floor("D")), on="day")\
        .drop(["day","Date_y"],1).rename({"Date_x":"Date"},axis=1)
    
                         Date    Close  range
    2019-06-19 23:00:00+00:00  2927.25    115
    2019-06-19 23:05:00+00:00  2927.00    115
    2019-06-19 23:10:00+00:00  2926.75    115
    2019-06-20 23:00:00+00:00  2932.25     86
    2019-06-20 23:05:00+00:00  2932.25     86
    2019-06-20 23:10:00+00:00  2931.00     86
    2019-06-23 23:00:00+00:00  2941.75     52
    2019-06-23 23:05:00+00:00  2942.25     52
    2019-06-23 23:10:00+00:00  2941.50     52
    2019-06-24 23:00:00+00:00  2925.50    132
    2019-06-24 23:05:00+00:00  2926.50    132
    2019-06-24 23:10:00+00:00  2926.50    132