[英]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.