python - 使用 Pandas 合并每日和每月时间序列
问题描述
我有两个数据框,带有每月数据的“bio”,我只需要列 bio['Bio_Avg']。还有一个带有每日数据的“tc”。两者都有日期时间索引。
我需要合并保持每日粒度但添加重复列 bio['Bio_Avg'] 的值的每月数据。
print(bio.head(5))
year month ncena ... contingency D Bio_Avg
Date ...
2019-12-01 2019 12 NaN ... NaN 1 38826.48
2019-11-01 2019 11 NaN ... NaN 1 33867.68
2019-10-01 2019 10 NaN ... NaN 1 31358.80
2019-09-01 2019 9 NaN ... NaN 1 29583.84
2019-08-01 2019 8 NaN ... NaN 1 27763.12
和
print(tc.head(5))
exchg_rate
2019-11-01 59.71
2019-11-02 59.74
2019-11-03 59.73
2019-11-04 59.70
2019-11-05 59.65
预期的结果应该是:
exchg_rate Bio_Avg
2019-11-01 59.71 33867.68
2019-11-02 59.74 33867.68
2019-11-03 59.73 33867.68
2019-11-04 59.70 33867.68
2019-11-05 59.65 33867.68
我试过了:
merge = pd.merge(tc, bio, left_index=True, right_index=True)
print(merge.head(5))
我得到:
exchg_rate year month ... contingency D Bio_Avg
2019-11-01 59.75 2019 11 ... NaN 1 33867.68
2019-12-01 59.94 2019 12 ... NaN 1 38826.48
当然,它只与日期保持完全匹配,但我放松了两者之间的日子。在不破坏所有数据帧的情况下,有什么优雅的方法可以解决这个问题?
解决方案
首先,我们将重置 df2 上的索引,然后在您的月份列上合并,如果月份列不存在,我们可以使用df['Date'].dt.month
#df1 = bio
#df2 = tc
#df2.reset_index(inplace=True)
df2 = df2.reset_index()
merged_df = pd.merge(
df2,
df[["month", "Bio_Avg"]],
left_on=df2['Date'].dt.month,
right_on="month"
).drop("month", axis=1)
print(merged_df)
Date exchg_rate Bio_Avg
0 2019-11-01 59.71 33867.68
1 2019-11-02 59.74 33867.68
2 2019-11-03 59.73 33867.68
3 2019-11-04 59.70 33867.68
4 2019-11-05 59.65 33867.68
编辑:
使用多个列加入,而不是使用您预先构建的月份 + 年份列,我们可以从实际Date
列中提取它们,确保它是一个日期时间,使用pd.to_datetime(your_dfs['Date'])
final =pd.merge(
bio[["Bio_Avg", "Date"]],
tc,
left_on=[bio["Date"].dt.year, bio["Date"].dt.month],
right_on=[tc["Date"].dt.year, tc["Date"].dt.month],
how="right",
suffixes=("bio", "tc_"),
).drop(["key_0", "key_1"], axis=1)
print(final)
Bio_Avg Datebio Datetc_ exchg_rate
0 33867.68 2019-11-01 2019-11-01 59.71
1 33867.68 2019-11-01 2019-11-02 59.74
2 33867.68 2019-11-01 2019-11-03 59.73
3 33867.68 2019-11-01 2019-11-04 59.70
4 33867.68 2019-11-01 2019-11-05 59.65
推荐阅读
- amazon-redshift - Redshift UNLOAD COPY 失败数据损坏 stl_load_errors MAXFILESIZE
- java - 将 Logback 与 Lombok 一起使用
- python - DataFrame(Python)中的最后一个匹配值
- sql-server - SQL 日期和最近的条目记录
- swift - 如何计算两个日期之间的天数
- sql-server - UNION 和文字值,奇怪的结果
- r - 带间隔的表格的直方图
- javascript - 如何随机化通知变量的数字
- c++ - 分配 FILE* 时的 SIGSEGV
- c - 在不使用递归的情况下,少于 n 个循环来解决“n 个皇后”?