如何根据日期和月份范围合并数据框?
How can i merge dataframes based on a day and month range?
我有 table A 和 table B 如下:
Table一个
from to comercial_event
0 01/07 02/07 January sales
1 02/12 02/12 Chinese new year
2 02/13 02/18 Carnival
3 02/07 02/14 Valentine's Day
4 03/12 03/19 Father's day
TableB
dates comercial_event month_day
0 2017-01-14 23:01:10+00:00 unknown 01/14
1 2017-08-29 23:01:10+00:00 unknown 08/29
2 2017-02-13 23:01:10+00:00 unknown 02/13
3 2017-08-31 23:01:10+00:00 unknown 08/31
4 2017-03-15 23:01:10+00:00 unknown 03/15
我想做的是使用 table B 中的 month_day
列作为参考合并 2 table。 month_day
列仅表示月份和日期(没有年份)。如果此列的值介于 table A 的 from
和 to
列的值之间,则应更新 table B 的 comercial_event
列Table A 的 comercial_event
列的值,用于该月和日范围。输出将是这样的:
dates comercial_event month_day
0 2017-01-14 23:01:10+00:00 January Sales 01/14
1 2017-08-29 23:01:10+00:00 unknown 08/29
2 2017-02-13 23:01:10+00:00 Valentine's Day 02/13
3 2017-08-31 23:01:10+00:00 unknown 08/31
4 2017-03-15 23:01:10+00:00 Father's day 03/15
如果 month_day
值与多个商业事件同时发生,则 comercial_event
列值应为“多个”。
我看过 question and this 个问题,但其中 none 个似乎真正解决了这个问题。
我正在使用 python 2.7
和 pandas 0.24
。
我该如何解决这个问题?
让我们做
idx = pd.IntervalIndex.from_arrays(pd.to_datetime(df1['from'], format='%m/%d'),
pd.to_datetime(df1['to'],format='%m/%d'), 'both')
s = pd.Series(df1.comercial_event.tolist(), index=idx)
look = pd.to_datetime(df2['month_day'], format='%m/%d')
l = []
for x in look:
try:
l.append(s.loc[[x]].tolist())
except:
l.append(np.nan)
df2['out'] = l
df2
Out[117]:
dates comercial_event month_day out
0 2017-01-14 unknown 01/14 [Januarysales]
1 2017-08-29 unknown 08/29 NaN
2 2017-02-13 unknown 02/13 [Carnival, Valentine'sDay]
3 2017-08-31 unknown 08/31 NaN
4 2017-03-15 unknown 03/15 [Father'sday]
我有 table A 和 table B 如下:
Table一个
from to comercial_event
0 01/07 02/07 January sales
1 02/12 02/12 Chinese new year
2 02/13 02/18 Carnival
3 02/07 02/14 Valentine's Day
4 03/12 03/19 Father's day
TableB
dates comercial_event month_day
0 2017-01-14 23:01:10+00:00 unknown 01/14
1 2017-08-29 23:01:10+00:00 unknown 08/29
2 2017-02-13 23:01:10+00:00 unknown 02/13
3 2017-08-31 23:01:10+00:00 unknown 08/31
4 2017-03-15 23:01:10+00:00 unknown 03/15
我想做的是使用 table B 中的 month_day
列作为参考合并 2 table。 month_day
列仅表示月份和日期(没有年份)。如果此列的值介于 table A 的 from
和 to
列的值之间,则应更新 table B 的 comercial_event
列Table A 的 comercial_event
列的值,用于该月和日范围。输出将是这样的:
dates comercial_event month_day
0 2017-01-14 23:01:10+00:00 January Sales 01/14
1 2017-08-29 23:01:10+00:00 unknown 08/29
2 2017-02-13 23:01:10+00:00 Valentine's Day 02/13
3 2017-08-31 23:01:10+00:00 unknown 08/31
4 2017-03-15 23:01:10+00:00 Father's day 03/15
如果 month_day
值与多个商业事件同时发生,则 comercial_event
列值应为“多个”。
我看过
我正在使用 python 2.7
和 pandas 0.24
。
我该如何解决这个问题?
让我们做
idx = pd.IntervalIndex.from_arrays(pd.to_datetime(df1['from'], format='%m/%d'),
pd.to_datetime(df1['to'],format='%m/%d'), 'both')
s = pd.Series(df1.comercial_event.tolist(), index=idx)
look = pd.to_datetime(df2['month_day'], format='%m/%d')
l = []
for x in look:
try:
l.append(s.loc[[x]].tolist())
except:
l.append(np.nan)
df2['out'] = l
df2
Out[117]:
dates comercial_event month_day out
0 2017-01-14 unknown 01/14 [Januarysales]
1 2017-08-29 unknown 08/29 NaN
2 2017-02-13 unknown 02/13 [Carnival, Valentine'sDay]
3 2017-08-31 unknown 08/31 NaN
4 2017-03-15 unknown 03/15 [Father'sday]