我正在尝试使用另一个日期列表来拆分一个日期列表。所以:
d = {'date':['1/15/2015','2/15/2015'], 'num':[1,2]}
s = {'split':['2/1/2015']}
df = pd.DataFrame(d)
sf = pd.DataFrame(s)
df['date'] = pd.to_datetime(df['date'])
sf['split'] = pd.to_datetime(sf['split'])
df['date'].split_by(sf['split'])
会产生:
date num
0 2015-01-15 1.0
1 2015-02-01 NaN
2 2015-02-15 2.0
...但当然,事实并非如此。我确信这里缺少一个简单的合并或连接,但我无法弄清楚。谢谢。
此外,如果 'split'
列表有多个日期,其中一些日期超出 'date'
列表的范围,我不希望将它们包括在内。所以基本上,新范围的范围将与旧范围相同。
(旁注:如果有更好的方法将字典转换为 DataFrame 并立即将日期字符串转换为日期时间,那将是锦上添花)
最佳答案
我认为你需要boolean indexing
首先按 df
中 date
列的 min
和 max
过滤 sf
concat
与 sort_values
,为了对齐需要重命名列:
d = {'date':['1/15/2015','2/15/2015'], 'num':[1,2]}
s = {'split':['2/1/2015', '2/1/2016', '2/1/2014']}
df = pd.DataFrame(d)
sf = pd.DataFrame(s)
df['date'] = pd.to_datetime(df['date'])
sf['split'] = pd.to_datetime(sf['split'])
print (df)
date num
0 2015-01-15 1
1 2015-02-15 2
print (sf)
split
0 2015-02-01
1 2016-02-01
2 2014-02-01
mask = (sf.split <= df.date.max()) & (sf.split >= df.date.min())
print (mask)
0 True
1 False
2 False
Name: split, dtype: bool
sf = sf[mask]
print (sf)
split
0 2015-02-01
df = pd.concat([df, sf.rename(columns={'split':'date'})]).sort_values('date')
print (df)
date num
0 2015-01-15 1.0
0 2015-02-01 NaN
1 2015-02-15 2.0
关于python - 根据另一个 pandas 日期列表拆分 pandas 日期列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41276829/