熊猫:从日期时间索引合并日期和小时
Posted
技术标签:
【中文标题】熊猫:从日期时间索引合并日期和小时【英文标题】:Pandas : merge on date and hour from datetime index 【发布时间】:2019-06-27 23:16:58 【问题描述】:我有两个数据框,如下所示,数据框 A 有日期时间,即使是分钟,数据框 B 只有小时。
df:A
dataDate original
2018-09-30 11:20:00 3
2018-10-01 12:40:00 10
2018-10-02 07:00:00 5
2018-10-27 12:50:00 5
2018-11-28 19:45:00 7
df:B
dataDate count
2018-09-30 10:00:00 300
2018-10-01 12:00:00 50
2018-10-02 07:00:00 120
2018-10-27 12:00:00 234
2018-11-28 19:05:00 714
我喜欢根据小时日期和小时合并两者,所以现在数据框 A 中的所有行都应该在日期和小时合并的基础上填充
我可以尝试通过
A['date'] = A.dataDate.date
B['date'] = B.dataDate.date
A['hour'] = A.dataDate.hour
B['hour'] = B.dataDate.hour
然后合并
merge_df = pd.merge(A,B, how='left', left_on=['date', 'hour'],
right_on=['date', 'hour'])
但这是一个非常漫长的过程,他们是在 pandas 时间序列或日期功能的帮助下执行相同操作的有效方法吗?
【问题讨论】:
【参考方案1】:如果需要,使用map
仅将一列从B
附加到A
,floor
用于设置minute
s 和second
s(如果存在)到0
:
d = dict(zip(B.dataDate.dt.floor('H'), B['count']))
A['count'] = A.dataDate.dt.floor('H').map(d)
print (A)
dataDate original count
0 2018-09-30 11:20:00 3 NaN
1 2018-10-01 12:40:00 10 50.0
2 2018-10-02 07:00:00 5 120.0
3 2018-10-27 12:50:00 5 234.0
4 2018-11-28 19:45:00 7 714.0
对于一般解决方案,请使用DataFrame.join
:
A.index = A.dataDate.dt.floor('H')
B.index = B.dataDate.dt.floor('H')
A = A.join(B, lsuffix='_left')
print (A)
dataDate_left original dataDate count
dataDate
2018-09-30 11:00:00 2018-09-30 11:20:00 3 NaT NaN
2018-10-01 12:00:00 2018-10-01 12:40:00 10 2018-10-01 12:00:00 50.0
2018-10-02 07:00:00 2018-10-02 07:00:00 5 2018-10-02 07:00:00 120.0
2018-10-27 12:00:00 2018-10-27 12:50:00 5 2018-10-27 12:00:00 234.0
2018-11-28 19:00:00 2018-11-28 19:45:00 7 2018-11-28 19:05:00 714.0
【讨论】:
以上是关于熊猫:从日期时间索引合并日期和小时的主要内容,如果未能解决你的问题,请参考以下文章