Объединение двух данных по дате - PullRequest
0 голосов
/ 27 марта 2019

У меня есть два кадра данных с использованием панд, один (df_1) - это средняя температура по дням года до определенного момента времени (например, средняя температура за все дни 2014 года до 03/01/2014) и другое (df_2) - средняя дневная температура за последние 30 лет.

Что я хочу сделать, так это завершить первый кадр данных средними значениями по дням во втором, я не могу использовать день года из-за некоторых високосных лет, но я не уверен, что это правильный путь. Я нашел способ получить среднюю температуру по дням ( Получить средний год (среднее число дней за несколько лет) в Пандах ), чтобы получить df_3. Моя конечная цель - заполнить df_1 за пропущенные дни (01.04.2014, ..., 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 голосов
/ 27 марта 2019

Вот метод для достижения этой цели:

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

Обратите внимание, как сглаживаются данные после 1 марта, поскольку это среднее значение за 30 лет для случайно сгенерированных данных, в то время как данные за первые 2 месяца не были усреднены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...