仅在特定时间合并两个数据框

时间:2016-09-30 20:36:41

标签: python pandas

我有两个excel文件,我尝试使用pandas合并为一个文件。第一个文件是具有该给定时间和日期的订户计数的时间和日期的列表。第二个文件每小时都有天气信息。我导入了两个文件,数据类似于:

df1=

Date                  Count
2010-01-02 09:00:00   15
2010-01-02 10:00:00   8
2010-01-02 11:00:00   9
2010-01-02 12:00:00   11
2010-01-02 13:00:00   8
2010-01-02 14:00:00   10
2010-01-02 15:00:00   8
2010-01-02 16:00:00   6
...

df2 = 

Date                  Temp  Rel_Hum   Pressure  Weather
2010-01-00 09:00:00  -5     93        100.36    Snow,Fog 
2010-01-01 10:00:00  -5     93        100.36    Snow,Fog
2010-01-02 11:00:00  -6.5   91        100       Snow,Fog
2010-01-03 12:00:00  -7     87        89        Snow,Fog
2010-01-04 13:00:00  -7     87        89        Snow,Fog
2010-01-05 14:00:00  -6.7   88        89        Snow,Fog
2010-01-06 15:00:00  -6.5   89        89        Snow,Fog
2010-01-07 16:00:00  -6     88        90        Snow,Fog
2010-01-08 17:00:00  -6     89        89        Snow,Fog
...

我只需要为df1中指定的时间天气信息,但df2包含该月每天24小时的天气信息。

由于df1只包含2列,因此我修改了df1以获得Temp Rel_Hum PressureWeather列所以它类似于:

Date                  Count Temp  Rel_Hum Pressure  Weather
2010-01-02 09:00:00   15    0     0       0         0
2010-01-02 10:00:00   8     0     0       0         0
2010-01-02 11:00:00   9     0     0       0         0
2010-01-02 12:00:00   11    0     0       0         0
2010-01-02 13:00:00   8     0     0       0         0
2010-01-02 14:00:00   10    0     0       0         0
2010-01-02 15:00:00   8     0     0       0         0
2010-01-02 16:00:00   6     0     0       0         0
...

我设法测试了我写了一个月的代码,而我遇到的问题是它花了很多时间来完成任务。我想知道是否有更快的方式来实现这个

import pandas as pd
import numpy as np
from datetime import datetime

location = '/home/lukasz/Documents/BUS/HOURLY_DATA.xlsx'
location2 = '/home/lukasz/Documents/BUS/Weather Data/2010-01.xlsx'

df1 = pd.read_excel(location)
df2 = pd.read_excel(location2)

df.Temp = df.Temp.astype(float)
df.Rel_Hum = df.Rel_Hum.astype(float)
df.Pressure = df.Pressure.astype(float)
df.Weather = df.Weather.astype(str)

n = len(df2) - len(df)

for i in range(len(df)):
    print(df['Date'][i])
    for j in range(i, i+n):
        date_object = datetime.strptime(df2['Date/Time'][j], '%Y-%m-%d %H:%M') # The date column in df2 is a str 
        if df['Date'][i] == date_object:
            df.set_value(i, 'Temp', df2['Temp'][j])
            df.set_value(i, 'Dew_Point_Temp', df2['Dew_Point_Temp'][j])
            df.set_value(i, 'Rel_Hum', df2['Rel_Hum'][j])
            df.set_value(i, 'Pressure', df2['Pressure'][j])
            df.set_value(i, 'Weather', df2['Weather'][j])

# print(df[:5])

df.to_excel(location, index=False)

1 个答案:

答案 0 :(得分:1)

使用reindex的组合来df2df1对齐。确保包含参数method='ffill'以转发填充天气信息。

然后使用join

df1.join(df2.set_index('Date').reindex(df1.Date, method='ffill'), on='Date')

enter image description here