Python 基于时间戳中两个Xolumn中的元素分隔行

Python 基于时间戳中两个Xolumn中的元素分隔行,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,基于两个日期范围(98-00和01-03),我希望得到两个单独的数据帧(每个日期范围一个),其中仅存在两个范围值中都存在的节点。 例如,第一行中的node2:5仅出现在98-00范围内,而不出现在01-03范围内,因此我们排除所有带5的行(可以在node1或node2列中)。同样,第二行node1:2中的node2:2仅出现在01-02日期范围内,因此排除两个数据帧中带值2的所有行。) 预期产出: 在一个数据帧中:节点1节点2日期 data = {'date': ['1998', '2002',

基于两个日期范围(98-00和01-03),我希望得到两个单独的数据帧(每个日期范围一个),其中仅存在两个范围值中都存在的节点。 例如,第一行中的node2:5仅出现在98-00范围内,而不出现在01-03范围内,因此我们排除所有带5的行(可以在node1或node2列中)。同样,第二行node1:2中的node2:2仅出现在01-02日期范围内,因此排除两个数据帧中带值2的所有行。)

预期产出:

在一个数据帧中:节点1节点2日期

data = {'date': ['1998', '2002','1999','2001','1998','2002'], 
        'node1': [1,1,1,1,3,3],
     'node2': [5,3,3,2,4,4],
     'weight': [1,1,1,1,1,1], }
df = pd.DataFrame(data, columns = ['date', 'node1','node2','weight'])
               1       3      1999

               3       4       1998
第二个数据帧:节点1节点2日期

data = {'date': ['1998', '2002','1999','2001','1998','2002'], 
        'node1': [1,1,1,1,3,3],
     'node2': [5,3,3,2,4,4],
     'weight': [1,1,1,1,1,1], }
df = pd.DataFrame(data, columns = ['date', 'node1','node2','weight'])
               1       3      1999

               3       4       1998

使用
pd.cut

                1       3      2001

                3       4      2002 
您可以将它们存储在列表中

df = df[df.duplicated(['node1','node2'],keep = False)]
df['range']=pd.cut(df.date.astype(int),[1997,2000,2002])

for x,y in df.dropna().groupby('range'):
    print(x)
    print(y)

(1997, 2000]
   date  node1  node2  weight         range
2  1999      1      3       1  (1997, 2000]
4  1998      3      4       1  (1997, 2000]
(2000, 2002]
   date  node1  node2  weight         range
1  2002      1      3       1  (2000, 2002]
5  2002      3      4       1  (2000, 2002]
可以使用.between()为每个数据帧筛选所需的行

l=[]

for _,y in df.dropna().groupby('range'):
    l.append(y)
df1

df2

如果日期列为1998-02-12格式,请将其转换为datetime并使用.dt访问器获取年份

    date    node1   node2   weight
1   2002    1       3       1
5   2002    3       4       1

基本上,这是从两列node1和node2搜索元素,如果它们都在范围内(98-00和01-03)。如果元素不在任何范围内,则不包括包含该元素的行。我的实际日期格式为1998-02-12。这会在代码中产生问题吗?因为我得到的答案略有不同。谢谢
import datetime as dt
df['date'] = pd.to_datetime(df['date'])
df1 = df[df['date'].dt.year.between(1998, 2000)]
df2 = df[df['date'].dt.year.between(2001, 2003)]