pandas 如何将 Dataframe 与时间范围合并?

83qze16e  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(183)

我正在尝试从其他时间范围 Dataframe Map时间类别。下面是时间范围 Dataframe 。“开始”和“结束”之间的时间被分类为每个“周”。

Start        End  Weeks
0 2019-08-30 2019-10-03      1
1 2019-10-04 2019-10-31      2
2 2019-11-01 2019-11-28      3

字符串
这是我的时间数据框。

Date
0 2019-09-06
1 2019-10-13
2 2019-10-12
3 2019-11-04

下面是我想要的输出。您可以看到,每个日期都根据TimeRange Dataframe被分类到相应的“Weeks”中。

Date Weeks
0 2019-09-06     1
1 2019-10-13     2
2 2019-10-12     2
3 2019-11-04     3

我的代码如下。

import pandas as pd
# Date Range dataframe
Date_Range = {'Start':[datetime.datetime(2019, 8, 30, 0, 0),datetime.datetime(2019, 10, 4, 0, 0),datetime.datetime(2019, 11, 1, 0, 0)],
              'End':[datetime.datetime(2019, 10, 3, 0, 0),datetime.datetime(2019, 10, 31, 0, 0),datetime.datetime(2019, 11, 28, 0, 0)],
              'Weeks':[1,2,3],}
Date_Range_DF = pd.DataFrame(Date_Range)
print(Date_Range_DF)

# My dataframe
Date = {'Date':[datetime.datetime(2019, 9, 6, 0, 0),datetime.datetime(2019, 10, 13, 0, 0),datetime.datetime(2019, 10, 12, 0, 0),datetime.datetime(2019, 11, 4, 0, 0)]}
Date_DF = pd.DataFrame(Date)
print(Date_DF)

# Merge Dataframe
import numpy as np
import pandas as pd
df1 = Date_Range
df2 = Date_Range_DF
df2.start, df2.End = pd.to_datetime(df2.Start), pd.to_datetime(df2.End)
filtered = pd.merge_asof(df1, df2, left_on='Date', right_on='Start')

但是,它一直显示错误TypeError: Can only merge Series or DataFrame objects, a <class 'dict'> was passed
请帮我找窃听器。谢谢。

p3rjfoxz

p3rjfoxz1#

第一步

制作边界列表(bins

bins = [Date_Range_DF.loc[0, 'Start'] - pd.Timedelta('1day')] + Date_Range_DF['End'].tolist()

bins

[Timestamp('2019-08-29 00:00:00'),
 Timestamp('2019-10-03 00:00:00'),
 Timestamp('2019-10-31 00:00:00'),
 Timestamp('2019-11-28 00:00:00')]

第二步

pd.cut划分类别(使用bins的边界)

s = pd.cut(pd.to_datetime(Date_DF['Date']), bins=bins, labels=df1['Weeks'].tolist())

s

0    1
1    2
2    2
3    3
Name: Date, dtype: category
Categories (3, int64): [1 < 2 < 3]

第三步

s转换为Weeks

Date_DF['Weeks'] = s

Date_DF

Date        Weeks
0   2019-09-06  1
1   2019-10-13  2
2   2019-10-12  2
3   2019-11-04  3

如果不希望Week dtype是category,请使用以下代码,例如make int

Date_DF['Weeks'] = s.astype('int')

其他方式

pd.merge_asof(Date_DF.sort_values('Date'), Date_Range_DF.drop('End', axis=1).rename(columns={'Start':'Date'}).sort_values('Date'))

您可以获得结果merge_asof,但对于晚于“2019-11-28”的日期,需要进行额外处理

相关问题