我有以下每小时数据框dfA:
Date/Time Value1 Value2
01.03.2010 00:00:00 60 10
01.03.2010 01:00:00 50 20
01.03.2010 02:00:00 52 30
01.03.2010 03:00:00 49 40
.
.
.
31.12.2013 23:00:00 77 50
我有第二个数据帧dfB,每年都有一个vaules:
Date/Time Value1 Value2
31.12.2010 1.5 0.9
31.12.2011 1.6 1.1
31.12.2012 1.7 2.3
31.12.2013 1.3 0.6
我想将dfA中的每小时值乘以数据帧dfB中相应年份的因子。
结果应如下所示:
Date/Time Value1 Value2
01.03.2010 00:00:00 90 9
01.03.2010 01:00:00 75 18
01.03.2010 02:00:00 78 27
01.03.2010 03:00:00 73.5 36
.
.
.
31.12.2013 23:00:00 100.1 30
我一直在尝试使用dfC = dfA*dfB[dfA.index.year()]
,但我收到错误TypeError: 'numpy.ndarray' object is not callable
。
任何人都可以帮我这个吗?
答案 0 :(得分:3)
您可以尝试附加到df1
df1.index.year
的索引,然后将df2
的索引更改为years
,然后使用mul
:
print df1
Value1 Value2
Date/Time
2010-01-03 00:00:00 60 10
2010-01-03 01:00:00 50 20
2010-01-03 02:00:00 52 30
2010-01-03 03:00:00 49 40
2013-12-31 23:00:00 77 50
print df2
Value1 Value2
Date/Time
2010-12-31 1.5 0.9
2011-12-31 1.6 1.1
2012-12-31 1.7 2.3
2013-12-31 1.3 0.6
df1 = df1.set_index(df1.index.year, append=True)
df2.index = df2.index.year
print df1
Value1 Value2
Date/Time
2010-01-03 00:00:00 2010 60 10
2010-01-03 01:00:00 2010 50 20
2010-01-03 02:00:00 2010 52 30
2010-01-03 03:00:00 2010 49 40
2013-12-31 23:00:00 2013 77 50
print df2
Value1 Value2
2010 1.5 0.9
2011 1.6 1.1
2012 1.7 2.3
2013 1.3 0.6
print df1.mul(df2, level=1).reset_index(drop=True, level=1)
Value1 Value2
Date/Time
2010-01-03 00:00:00 90.0 9
2010-01-03 01:00:00 75.0 18
2010-01-03 02:00:00 78.0 27
2010-01-03 03:00:00 73.5 36
2013-12-31 23:00:00 100.1 30
答案 1 :(得分:2)
假设您从
开始dfA = pd.DataFrame({
'Date/Time': ['01.03.2010 00:00:00'],
'Value1': [60],
'Value2': [10]})
dfB = pd.DataFrame({
'Date/Time': ['01.03.2010'],
'Value1': [1.5],
'Value2': [0.9]})
为每个DataFrame添加'year'
列:
dfA['year'] = pd.to_datetime(dfA['Date/Time'])
dfB['year'] = pd.to_datetime(dfB['Date/Time'])
现在只需左栏合并此列:
>>> pd.merge(
dfA,
dfB,
left_on='year',
right_on='year',
how='left')
Date/Time_x Value1_x Value2_x year Date/Time_y Value1_y Value2_y
0 01.03.2010 00:00:00 60 10 2010-01-03 01.03.2010 1.5 0.9
请注意,合并添加了后缀'_x'
和'_y'
。
除了这个合并之外,你可以按常规方式将列相乘,摆脱你不需要的列等等。
答案 2 :(得分:2)
最简单的方法可能是将较低频率的系列/数据帧上采样到更高的频率,然后再乘以。
In [82]: s1 = pd.Series(np.random.randn(31), index=pd.date_range(start='2015-01-01', end='2015-01-31', freq='d'))
In [83]: s2 = pd.Series(np.random.randn(4), index=pd.date_range(start='2015-01-01', end='2015-01-31', freq='W'))
In [84]: s2.resample('d').mean().reindex(s1.index).ffill().bfill() * s1
Out[84]:
2015-01-01 0.361944
2015-01-02 2.806391
2015-01-03 0.741745
2015-01-04 0.855619
2015-01-05 -2.127828
...
2015-01-27 0.533919
2015-01-28 0.792278
2015-01-29 1.722754
2015-01-30 0.822032
2015-01-31 0.729741
Freq: D, dtype: float64
在这种情况下我们需要额外的redindex(s1.index)
,因为开始和结束不完全对齐。