按日期合并两个数据框

时间:2019-03-27 16:42:47

标签: python pandas date dataframe

我有两个使用熊猫的数据框,一个(df_1)是一年中某天直到某个时间点的平均温度(例如,2014年全年直到2014年3月1日的平均温度),其他(df_2)是最近30年的每日平均温度。

我想做的是通过第二天的平均值来完成第一个数据框,由于leap年,我无法使用一年中的某天,但是我不确定这是正确的方法。我找到了一种方法来按天(Get the average year (mean of days over multiple years) in Pandas)获取平均温度来获取df_3。我的最终目标是在失踪的日子中完成df_1(因此,2014年4月1日,...,31/12/2014)

df_1 = pd.DataFrame({
               'Date': ['01/01/2014','02/01/2014','03/01/2014'], 'T_Avg_2014': [5,6,0.7]})

df_2 = pd.DataFrame({
               'Date': ['01/01/2009','02/01/2010','01/01/2011'], 'T_Avg': [5,-8,-7]})




index = pd.MultiIndex.from_tuples([('1', '1'),
                                   ('1', '2'),
                                  ('1', '3'),
                                   ('2', '1')],
                                 names=['month', 'day'])
columns = [('T_Avg')]
df_3 = pd.DataFrame([3,4,8,10],
                 index=index,
                 columns=columns)

1 个答案:

答案 0 :(得分:0)

这里是实现此目的的方法:

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

# Create date ranges
date1 = pd.date_range(datetime(2014,1,1), datetime(2014,3,1)) # 2014
date2 = pd.date_range(datetime(1983,1,1), datetime(2013,12,31)) # 30 years

# Create data frames
df1 = pd.DataFrame({'temperature': np.random.rand(len(date1))*100}, index = date1)
df2 = pd.DataFrame({'temperature': np.random.rand(len(date2))*100}, index = date2)

# Compute average daily temperature from 30 year data
df3 = df2.groupby([df2.index.month, df2.index.day]).mean()
df3 = df3.reset_index().rename(columns={'level_0': 'month', 'level_1': 'day'})

# Get data to use to complete df1
idx = df3.index[(df3.month == 3) & (df3.day == 1)][0] + 1 # All past March 1st
data_fill = df3.loc[idx:, ['month', 'day', 'temperature']]
data_fill['date_time'] = pd.to_datetime(data_fill.month.map(str)+'-'+data_fill.day.map(str)+'-2014')
data_fill = data_fill.set_index('date_time')
data_fill = data_fill.drop(columns=['month', 'day'])

# Combine data frames
df4 = pd.concat([df1, data_fill])

# Visualize data
df4.plot()

Combined temperature data

请注意如何平滑3月1日之后的数据,因为这是随机生成的数据的30年平均值,而前两个月的数据尚未进行平均。