繁体   English   中英

如何将使用数据重塑为分钟格式?

[英]How can I reshape usage data into minute-by-minute format?

如何将以下原始使用数据重新塑造为“逐分钟数据帧”。 这种操作是否有特殊的 Pandas 功能可以将原始数据划分为分钟槽?

原始使用数据示例:

**Video-ID |        UsageStart** |  **Duration in sec** |

0 | 260581 |    2019-04-25 00:00:00 |   10 |

1 | 316288 |    2019-04-25 00:01:05 |   20 |

2 | 791714 |    2019-04-25 00:01:30 |   10 |

3 | 790503 |    2019-04-25 00:02:30 |   90 |

4 | 646034 |    2019-04-25 00:03:10 |   100 |

所需的输出: 分钟格式:

**Minute |  StartTime | UsageAmount in sec |**

1 | 2019-04-25 00:00:00 |   10 |

2 | 2019-04-25 00:01:00 |   30 |

3 | 2019-04-25 00:02:00 |   30 |

4 | 2019-04-25 00:03:00 |   110 |

5 | 2019-04-25 00:04:00 |   50 |

老实说,我不知道如何做到这一点。 也许这必须首先逐秒完成,然后重新调整为逐分钟格式。

感谢任何帮助。

# convert UsageStart to datetime column
df['UsageStart']= pd.to_datetime(df['UsageStart'])
# reindex and sum 
df = df.set_index('UsageStart').resample('1T').sum()

您好,您可以在将日期时间列设置为索引后使用pandas.DataFrame.resample方法,例如

df["UsageStart"] = pd.to_datetime["UsageStart"]
df = df.set_index("UsageStart")

df = df.resample(freq="1Min").mean()

但我不知道 mean 是否会给你想要的输出

不是单纯的pandas的解决方案,我相当肯定有很多棘手的那些的,oneliner方法来做到这一点,但我仍然是一个基本的大熊猫用户。

我使用一个递归函数,它通过将秒数添加到连续分钟数来消耗给定的duration ,存储为字典d键,从startime

def cumsec(startime, duration, d):
    if duration == 0:
        return d
    to_minute = (60 - startime.second)%60 if (60 - startime.second)%60 else 60
    to_add = to_minute if duration - to_minute >= 0 else duration
    d[startime.replace(second=0)] += to_add
    startime = (startime + dt.timedelta(minutes=1)).replace(second=0)
    return cumsec(startime, duration - to_add, d)



然后简单地将此函数应用于每一行:

from collections import defaultdict
import datetime as dt
import pandas as pd

# small df arrangements
df.columns = ["VideoId", "UsageStart", "Duration"]
df["UsageStart"] = pd.to_datetime(df["UsageStart"])


d = defaultdict(int)
for r in df.itertuples():
    cumsec(r.UsageStart, r.Duration, d)


为了增加可能的空分钟就可以做到以下几点,但我敢肯定有一个具体的方法pandas做到这一点(你可以跳过这一部分,如果这种行为是不想要的):

first = min(d.keys())
last = max(d.keys())

d = {
    first + dt.timedelta(minutes=i): d.get(first + dt.timedelta(minutes=i), 0) 
    for i in range(int((last - first).total_seconds()//60) + 1)
}

最后创建一个新的 DataFrame:

cumdf = pd.DataFrame({"StartTime": list(d.keys()), "UsageAmount": list(d.values())})
cumdf = cumdf.sort_values("StartTime").reset_index(drop=True)
cumdf["Minute"] = range(1, len(d) + 1)
print(cumdf)

因此,如果您的输入是:

Video-ID |        UsageStart |  Duration
459224 |    2019-04-24 23:59:59 |   2
260581 |    2019-04-25 00:00:00 |   10
316288 |    2019-04-25 00:01:05 |   20
791714 |    2019-04-25 00:01:30 |   10
790503 |    2019-04-25 00:02:30 |   90
646034 |    2019-04-25 00:03:10 |   100
934784 |    2019-04-25 00:09:10 |   40

输出将是:


             StartTime  UsageAmount  Minute
0  2019-04-24 23:59:00            1       1
1  2019-04-25 00:00:00           11       2
2  2019-04-25 00:01:00           30       3
3  2019-04-25 00:02:00           30       4
4  2019-04-25 00:03:00          110       5
5  2019-04-25 00:04:00           50       6
6  2019-04-25 00:05:00            0       7
7  2019-04-25 00:06:00            0       8
8  2019-04-25 00:07:00            0       9
9  2019-04-25 00:08:00            0      10
10 2019-04-25 00:09:00           40      11

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM