首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据python中的数据提取和整形数据

根据python中的数据提取和整形数据
EN

Stack Overflow用户
提问于 2017-05-17 15:09:03
回答 2查看 236关注 0票数 1

我只是在寻找一些帮助,以决定一个方法将是最有效的。我有一个有特定日期的数据集,没有固定的时间步骤。对于这些日期中的每一个,我希望创建一个值从日期前10天到日期后3天不等的行。我需要的数据是2列,其中一列是日期,另一列是值。

脑海中浮现的是使用一个循环来比较日期和提取我需要的值。我在想,也许还有更好的方法,用熊猫或者别的什么?我觉得我的想法是一种相当复杂的方式。

编辑:所以里面的数据应该是这样的。

代码语言:javascript
复制
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 

其中一行的示例输出将以以下形式显示:

代码语言:javascript
复制
                  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作为下面的每个日期。这就是促使我考虑使用循环的原因。但这似乎是一种杂乱无章的做法。

代码语言:javascript
复制
              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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-18 16:21:13

在使用您提供的表之前,我首先创建了列,然后才调用它们。

代码语言:javascript
复制
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给了我这个:

代码语言:javascript
复制
        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

然后,您希望循环遍历每一行,并使用索引(哪一行进行放气)和(哪一列)为每一列分配正确的值:

代码语言:javascript
复制
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

这是您的示例的输出

代码语言:javascript
复制
         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
票数 1
EN

Stack Overflow用户

发布于 2017-05-17 16:02:36

我会对你想要的东西做很多假设,但我想我理解你的问题。你有这样的东西。

代码语言:javascript
复制
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中的审批行。

代码语言:javascript
复制
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()

产出应如下:

代码语言:javascript
复制
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

如果我错了,请张贴一些例子,这样我们就可以看到这是否是你想要的。但我希望你能看到你能对熊猫做些什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44028675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档