PANDAS - 遍历两个不同大小的日期时间索引来比较日期和值
PANDAS - Loop over two datetime indexes with different sizes to compare days and values
寻找一种更有效的方法来循环和比较两个具有不同频率的 Series 对象中的 datetimeindex 值。
设置
想象两个 Pandas 系列,每个系列都有一个日期时间索引,涵盖同一年跨度,但每个索引的频率不同。一个以天为单位,另一个以小时为单位。
range1 = pd.date_range('2016-01-01','2016-12-31', freq='D')
range2 = pd.date_range('2016-01-01','2016-12-31', freq='H')
我正在尝试使用它们的索引作为匹配日期的查找来遍历这些系列,以便我可以比较每一天的数据。
我现在在做什么...慢。
现在我正在使用多级 for 循环和 if 语句(见下文);与我在 Pandas 操作中习惯的时间相比,完成这些循环的时间似乎过多(每个循环 5.45 秒)。
for date, val in zip(frame1.index, frame1['data']): # freq = 'D'
for date2, val2 in zip(frame2.index, frame2['data']): # freq = 'H'
if date.day == date2.day: # check to see if dates are a match
if val2 > val: # compare the values
# append values, etc
问题
是否有更有效的方法使用 frame1 中的索引循环 frame2 中的索引并比较给定日期每个帧中的值?最终,我想在 frame2 vals 大于 frame1 vals 的地方创建一系列值。
可重现(测试)示例
使用随机数据创建两个单独的系列,并为每个系列分配一个日期时间索引。
import pandas as pd
import numpy as np
range1 = pd.date_range('2016-01-01','2016-12-31', freq='D')
range2 = pd.date_range('2016-01-01','2016-12-31', freq='H')
frame1 = pd.Series(np.random.rand(366), index=range1)
frame2 = pd.Series(np.random.rand(8761), index=range2)
是,使用 resample
、asfreq
和 pd.concat
。
使用重新采样从您的系列中获得正确的频率。
asfreq(听起来有点脏)用于转换回具有在重新采样中定义的频率的系列。
与 frame1 连接以并排获取值。
df = pd.concat([frame1,frame2.resample('1D').asfreq()],axis=1)
df.head()
输出:
0 1
2016-01-01 0.147067 0.235858
2016-01-02 0.820398 0.353275
2016-01-03 0.840499 0.186273
2016-01-04 0.505740 0.340201
2016-01-05 0.547840 0.695041
然后,您可以使用以下方法返回超出 frame1 的 frame2 系列。
df.columns = ['frame1','frame2']
df.query('framed1 < frame2')['frame2']
仍然不确定您要如何处理这些信息。但我会这样做:
- 复制
frame2
- 将其索引拆分为日期和时间部分
- 比较指定级别
frame3 = frame2.copy()
frame3.index = [pd.to_datetime(frame3.index.date), frame.index.time]
results = frame3.lt(frame1, level=0)
results.head()
2016-01-01 00:00:00 True
01:00:00 True
02:00:00 True
03:00:00 True
04:00:00 True
dtype: bool
寻找一种更有效的方法来循环和比较两个具有不同频率的 Series 对象中的 datetimeindex 值。
设置
想象两个 Pandas 系列,每个系列都有一个日期时间索引,涵盖同一年跨度,但每个索引的频率不同。一个以天为单位,另一个以小时为单位。
range1 = pd.date_range('2016-01-01','2016-12-31', freq='D')
range2 = pd.date_range('2016-01-01','2016-12-31', freq='H')
我正在尝试使用它们的索引作为匹配日期的查找来遍历这些系列,以便我可以比较每一天的数据。
我现在在做什么...慢。
现在我正在使用多级 for 循环和 if 语句(见下文);与我在 Pandas 操作中习惯的时间相比,完成这些循环的时间似乎过多(每个循环 5.45 秒)。
for date, val in zip(frame1.index, frame1['data']): # freq = 'D'
for date2, val2 in zip(frame2.index, frame2['data']): # freq = 'H'
if date.day == date2.day: # check to see if dates are a match
if val2 > val: # compare the values
# append values, etc
问题
是否有更有效的方法使用 frame1 中的索引循环 frame2 中的索引并比较给定日期每个帧中的值?最终,我想在 frame2 vals 大于 frame1 vals 的地方创建一系列值。
可重现(测试)示例
使用随机数据创建两个单独的系列,并为每个系列分配一个日期时间索引。
import pandas as pd
import numpy as np
range1 = pd.date_range('2016-01-01','2016-12-31', freq='D')
range2 = pd.date_range('2016-01-01','2016-12-31', freq='H')
frame1 = pd.Series(np.random.rand(366), index=range1)
frame2 = pd.Series(np.random.rand(8761), index=range2)
是,使用 resample
、asfreq
和 pd.concat
。
使用重新采样从您的系列中获得正确的频率。
asfreq(听起来有点脏)用于转换回具有在重新采样中定义的频率的系列。
与 frame1 连接以并排获取值。
df = pd.concat([frame1,frame2.resample('1D').asfreq()],axis=1)
df.head()
输出:
0 1
2016-01-01 0.147067 0.235858
2016-01-02 0.820398 0.353275
2016-01-03 0.840499 0.186273
2016-01-04 0.505740 0.340201
2016-01-05 0.547840 0.695041
然后,您可以使用以下方法返回超出 frame1 的 frame2 系列。
df.columns = ['frame1','frame2']
df.query('framed1 < frame2')['frame2']
仍然不确定您要如何处理这些信息。但我会这样做:
- 复制
frame2
- 将其索引拆分为日期和时间部分
- 比较指定级别
frame3 = frame2.copy()
frame3.index = [pd.to_datetime(frame3.index.date), frame.index.time]
results = frame3.lt(frame1, level=0)
results.head()
2016-01-01 00:00:00 True
01:00:00 True
02:00:00 True
03:00:00 True
04:00:00 True
dtype: bool