如何按日期合并 DF,仅使用日期和月份,使用指定的日期范围

Posted

技术标签:

【中文标题】如何按日期合并 DF,仅使用日期和月份,使用指定的日期范围【英文标题】:How to merge DFs by date, using only day and month, using specified date range 【发布时间】:2018-08-28 18:34:08 【问题描述】:

我有一个包含日期范围的 DF (df0):

date
12/30/2018
12/31/2018
1/1/2019
1/2/2019
1/3/2019

还有一个带有数据的 DF (df1):

date        loc temp
12/30/2017  YYC 5.07
12/31/2017  YYC 5.64
1/1/2017    YYC 3.43
1/2/2017    YYC 7.89
1/3/2017    YYC 2.49
12/30/2017  YYZ 4.08
12/31/2017  YYZ 7.40
1/1/2017    YYZ 7.82
1/2/2017    YYZ 8.33
1/3/2017    YYZ 7.74

我想通过 仅使用 df1 中的日期和月份 将 df1 中的信息合并到 df0 中的日期范围来创建一个新的 df。如果年份不匹配也没关系。 IE:2018 年 12 月 30 日将在 df1 中获取 2017 年 12 月 30 日的数据。

df0 中的日期范围是我想保留的关键日期范围。

一个日历年中的每一天,每个位置只有一个温度值。如果 df0 跨越多年,则相同的值可能会出现多次。 IE:如果 df0 是一个长达十年的时间序列,我会看到 YYC = 5.07 十次,在时间序列的每个 12/30 上。

在上面的 df0 和 df1 示例中,新的数据框 (df2) 将有两个 2018 年 12 月 30 日的条目:

date        loc temp
12/30/2018  YYC 5.07
12/30/2018  YYZ 4.08

我不相信我可以 .merge 这些,因为它已经过时了。我不相信我可以做 .isin df0,因为我只需要匹配一部分(日和月)

【问题讨论】:

您的输出似乎有误。 date 来自 df1 但值来自具有列 Date 的 df0 我编辑了帖子 - 日期大写错误。你是对的,我希望保留 df0 中的日期。 【参考方案1】:

为每个数据框创建一个月和日列,然后将 df1 与 df0 合并:

import pandas as pd

df0['Date'] = pd.to_datetime(df0['Date'])
df1['date'] = pd.to_datetime(df1['date'])
df0['day'] = df0.Date.dt.day
df0['month'] = df0.Date.dt.month
df1['day'] = df1.date.dt.day
df1['month'] = df1.date.dt.month

df0.merge(df1, how='inner', on=['month', 'day']).drop(columns=['month', 'day', 'date'])

    Date    loc temp
0   2018-12-30  YYC 5.07
1   2018-12-30  YYZ 4.08
2   2018-12-31  YYC 5.64
3   2018-12-31  YYZ 7.4
4   2019-01-01  YYC 3.43
5   2019-01-01  YYZ 7.82
6   2019-01-02  YYC 7.89
7   2019-01-02  YYZ 8.33
8   2019-01-03  YYC 2.49
9   2019-01-03  YYZ 7.74

【讨论】:

感谢您的回答。我一直在想可能需要帮助者,但希望有另一种选择。对于.drop(columns=),我收到 .drop() got an unexpected keyword argument 'columns' 错误。我改为.drop(['month','day'],1),它似乎工作正常。你知道这是否是版本之间语法的变化吗? 还有一个问题 - 我在上面看到您关于日期/日期的评论,我更改了这些标题匹配。合并后,会产生两个日期列:date_x 和 date_y。关于删除正确日期的任何提示?我考虑在准备辅助列时将其删除。或者可以直接通过 date_correct letter 删除它,但我不确定 pandas 的自动命名约定。 所以当两个 DataFrame 都有一个不在合并键中的同名列时,你会得到 date_xdate_y。这样您就可以区分这些变量来自哪个 DataFrame。我建议只保留一个名为 Date 和另一个名为 date 的名称,这样您就可以删除最后不想要的任何一个,而不必担心重命名。 是的,看来 columns 参数是在 0.21.0 中添加的。

以上是关于如何按日期合并 DF,仅使用日期和月份,使用指定的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

如何按月份和年份输入过滤具有日期时间索引的数据框?熊猫

如何更改显示日期和时间的 x 轴以仅显示月份名称?

sql如何按日期中的月份查询

如何在 django 中使用日期时间过滤器仅用于日期和月份?

如何将日期,年,月的不同列合并/合并到单个列中

Angular 8 - 如何使用 ngxbootstrap/datepicker 仅显示日期和月份