我只是在寻找一些帮助,以决定一个方法将是最有效的。我有一个有特定日期的数据集,没有固定的时间步骤。对于这些日期中的每一个,我希望创建一个值从日期前10天到日期后3天不等的行。我需要的数据是2列,其中一列是日期,另一列是值。
脑海中浮现的是使用一个循环来比较日期和提取我需要的值。我在想,也许还有更好的方法,用熊猫或者别的什么?我觉得我的想法是一种相当复杂的方式。
编辑:所以里面的数据应该是这样的。
Date Values
2014-02-09 38.351
2014-02-10 38.281
2014-02-11 38.146
2014-02-12 38.205
2014-02-13 38.428
2014-02-14 38.449
2014-02-15 38.540
2014-02-16 38.586
2014-02-17 38.489
2014-02-18 38.552
2014-02-19 38.580
2014-02-20 38.447
2014-02-21 38.336
2014-02-22 38.284
2014-02-23 38.183
2014-02-24 38.143
2014-02-25 38.146
2014-02-26 38.221
2014-02-27 38.182
2014-02-28 38.170 其中一行的示例输出将以以下形式显示:
t-10 t-9 t-8 t-7 t-6 t-5 t-4 t-3 \
Date
2014-02-19 37.728 37.753 37.652 37.549 37.474 37.407 37.344 37.278
t-2 t-1 t t+1 t+2 t+3
Date
2014-02-19 37.221 37.18 37.125 37.138 37.414 37.394 当t= 2014-02-19时,提取从t-10到t+3的值。我需要在几个不同的日子里这样做。
编辑:我有这些具体的日期,我需要使用。值t-10到t+3,例如,t作为下面的每个日期。这就是促使我考虑使用循环的原因。但这似乎是一种杂乱无章的做法。
Date
0 2014-11-22
1 2014-12-28
2 2015-01-02
3 2015-02-04
4 2015-02-16
5 2015-02-28
6 2015-03-12
7 2015-03-24
8 2015-04-05
9 2015-04-15
10 2015-04-17
11 2015-04-20
12 2015-11-07
13 2015-11-10
14 2015-11-19
15 2015-11-22
16 2015-11-29
17 2015-12-01
18 2015-12-04
19 2015-12-11发布于 2017-05-18 16:21:13
在使用您提供的表之前,我首先创建了列,然后才调用它们。
df['Date'] = pd.to_datetime(df['Date'],format='%Y-%m-%d')
for daysDelta in range(-10,4):
key = 't'+str(daysDelta)
df[key] = np.nan当我看前五行时,Wich给了我这个:
Date Values t-10 t-9 t-8 t-7 t-6 t-5 t-4 t-3 t-2 t-1 t0 t1 t2 t3
0 2014-09-02 38.351 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 2014-10-02 38.281 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 2014-11-02 38.146 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 2014-12-02 38.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 2014-02-13 38.428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN然后,您希望循环遍历每一行,并使用索引(哪一行进行放气)和键(哪一列)为每一列分配正确的值:
for index, row in df.iterrows():
for daysDelta in range(-10,4): #loops through days
key = 't'+str(daysDelta)
# will be true if the difference of days is the one you are looking for
booleanTimeDelta = ((df.loc[:,'Date'] -row['Date']).dt.days == daysDelta)
# if any are true find them and assign it
if any(booleanTimeDelta):
df.loc[index:index+1,key] = df.loc[booleanTimeDelta,'Values'].values这是您的示例的输出
Date Values t-10 t-9 t-8 t-7 t-6 t-5 t-4 t-3 t-2 t-1 t0 t1 t2 t3
0 2014-09-02 38.351 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 38.351 NaN NaN NaN
1 2014-10-02 38.281 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 38.281 NaN NaN NaN
2 2014-11-02 38.146 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 38.146 NaN NaN NaN
3 2014-12-02 38.205 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 38.205 NaN NaN NaN
4 2014-02-13 38.428 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 38.428 38.449 38.540 38.586
5 2014-02-14 38.449 NaN NaN NaN NaN NaN NaN NaN NaN NaN 38.428 38.449 38.540 38.586 38.489
6 2014-02-15 38.540 NaN NaN NaN NaN NaN NaN NaN NaN 38.428 38.449 38.540 38.586 38.489 38.552
7 2014-02-16 38.586 NaN NaN NaN NaN NaN NaN NaN 38.428 38.449 38.540 38.586 38.489 38.552 38.580
8 2014-02-17 38.489 NaN NaN NaN NaN NaN NaN 38.428 38.449 38.540 38.586 38.489 38.552 38.580 38.447
9 2014-02-18 38.552 NaN NaN NaN NaN NaN 38.428 38.449 38.540 38.586 38.489 38.552 38.580 38.447 38.336
10 2014-02-19 38.580 NaN NaN NaN NaN 38.428 38.449 38.540 38.586 38.489 38.552 38.580 38.447 38.336 38.284
11 2014-02-20 38.447 NaN NaN NaN 38.428 38.449 38.540 38.586 38.489 38.552 38.580 38.447 38.336 38.284 38.183
12 2014-02-21 38.336 NaN NaN 38.428 38.449 38.540 38.586 38.489 38.552 38.580 38.447 38.336 38.284 38.183 38.143
13 2014-02-22 38.284 NaN 38.428 38.449 38.540 38.586 38.489 38.552 38.580 38.447 38.336 38.284 38.183 38.143 38.146
14 2014-02-23 38.183 38.428 38.449 38.540 38.586 38.489 38.552 38.580 38.447 38.336 38.284 38.183 38.143 38.146 38.221
15 2014-02-24 38.143 38.449 38.540 38.586 38.489 38.552 38.580 38.447 38.336 38.284 38.183 38.143 38.146 38.221 38.182
16 2014-02-25 38.146 38.540 38.586 38.489 38.552 38.580 38.447 38.336 38.284 38.183 38.143 38.146 38.221 38.182 38.182
17 2014-02-26 38.221 38.586 38.489 38.552 38.580 38.447 38.336 38.284 38.183 38.143 38.146 38.221 38.182 38.182 NaN
18 2014-02-27 38.182 38.489 38.552 38.580 38.447 38.336 38.284 38.183 38.143 38.146 38.221 38.182 38.182 NaN NaN发布于 2017-05-17 16:02:36
我会对你想要的东西做很多假设,但我想我理解你的问题。你有这样的东西。
In [1]: df
Out[1]:
dates numbers sumOfDates
0 2016-02-04 1 NaN
1 2016-02-13 2 NaN
2 2016-01-25 4 NaN
3 2016-01-16 1 NaN
4 2016-01-27 3 NaN
5 2016-01-13 4 NaN
6 2016-01-15 5 NaN
7 2016-01-29 1 NaN
8 2016-01-11 3 NaN
9 2016-01-17 4 NaN所有的NaN都在
这里数字是你说过的值。然后,通过迭代行,将所有文件定位在所需范围内,这应该很简单。然后,只需将其应用于和,并将其分配给sumOfDates中的审批行。
for index, row in df.iterrows():
df.loc[index,'sumOfDates'] = df[(df.dates >(row['dates']-pd.DateOffset(10)))].loc[(df.dates <
(row['dates']+pd.DateOffset(3)))].numbers.sum()产出应如下:
df
dates numbers sumOfDates
0 2016-02-04 1 5.0
1 2016-02-13 2 3.0
2 2016-01-25 4 12.0
3 2016-01-16 1 17.0
4 2016-01-27 3 8.0
5 2016-01-13 4 12.0
6 2016-01-15 5 17.0
7 2016-01-29 1 8.0
8 2016-01-11 3 7.0
9 2016-01-17 4 17.0如果我错了,请张贴一些例子,这样我们就可以看到这是否是你想要的。但我希望你能看到你能对熊猫做些什么。
https://stackoverflow.com/questions/44028675
复制相似问题