我有两个使用熊猫的数据框,一个(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)
答案 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()
请注意如何平滑3月1日之后的数据,因为这是随机生成的数据的30年平均值,而前两个月的数据尚未进行平均。