如何解决For 循环在日期时间列中计算分钟并附加到秒
我有一个数据框,我需要向日期时间列添加第二个单位。我尝试了各种重采样方法,但我做不到!!!这是我的数据示例。
$
id date_time
73430677 4:24:00
73430688 4:24:00
73430703 4:24:00
73430713 4:24:00
73430718 4:24:00
73430728 4:24:00
73430771 4:25:00
73430818 4:25:00
73430864 4:25:00
73430904 4:25:00
73430942 4:25:00
73430993 4:25:00
我如何计算相似的分钟数,然后根据它们的数量生成第二个间隔 uinte。例如,4:24:00 重复 6 次,然后每 10 秒收集一次数据。
我正在寻找一种计算相似分钟数的解决方案,然后通过以秒为单位计算数据收集时间间隔(60/(重复分钟数)),将秒值附加到日期时间列。
我欢迎任何实用的解决方案!!!!
解决方法
- 修改了您的示例数据,使一组 6 人和一组 5 人
-
groupby().transform()
计算要添加到时间的秒数 - 添加秒数
- 清理临时列秒
from pathlib import Path
df = pd.read_csv(io.StringIO("""id date_time
73430677 4:24:00
73430688 4:24:00
73430703 4:24:00
73430713 4:24:00
73430718 4:24:00
73430728 4:24:00
73430771 4:25:00
73430818 4:25:00
73430904 4:25:00
73430942 4:25:00
73430993 4:25:00"""),sep="\s+")
# add a dummy column
df["x"] = 1
f = Path.cwd().joinpath("SO_seconds.csv")
df.to_csv(f)
# read from a file
df = pd.read_csv(f)
df.date_time = pd.to_datetime(df.date_time)
# do the actual requirement
df = (df.assign(secs=df.groupby("date_time")["id"].transform(lambda s: [((i+1)/len(s))*60 for i,v in enumerate(s)]),date_time=lambda dfa: dfa.apply(lambda r: r.date_time + pd.Timedelta(seconds=r.secs),axis=1).dt.time)
.drop(columns=["secs"])
)
id | date_time | |
---|---|---|
0 | 73430677 | 04:24:10 |
1 | 73430688 | 04:24:20 |
2 | 73430703 | 04:24:30 |
3 | 73430713 | 04:24:40 |
4 | 73430718 | 04:24:50 |
5 | 73430728 | 04:25:00 |
6 | 73430771 | 04:25:12 |
7 | 73430818 | 04:25:24 |
8 | 73430904 | 04:25:36 |
9 | 73430942 | 04:25:48 |
10 | 73430993 | 04:26:00 |
使用 .groupby
方法并应用自定义函数,我们得到以下代码。我从您的数据框中删除了一行,以显示以秒为增量的差异:
import io
import datetime
import pandas as pd
resec_last = None
extra_secs = None
num_secs = None
dfg = None
def resec(row):
global resec_last,extra_secs,num_secs,dfg
new_blk = resec_last is None or row.date_time != resec_last
if new_blk:
resec_last = row.date_time
cnt = dfg.loc[row.date_time].id
extra_secs = datetime.timedelta(seconds=60/cnt)
num_secs = 1
else:
row.date_time += num_secs * extra_secs
num_secs += 1
return row
csv_str = '''\
id date_time
73430677 4:24:00
73430688 4:24:00
73430703 4:24:00
73430713 4:24:00
73430718 4:24:00
73430728 4:24:00
73430771 4:25:00
73430818 4:25:00
73430864 4:25:00
73430904 4:25:00
73430942 4:25:00
'''
# 73430993 4:25:00
with io.StringIO(initial_value=csv_str) as f:
df = pd.read_csv(f,sep='\s+')
df.date_time = pd.to_datetime(df.date_time)
dfg = df.groupby('date_time').count()
df2 = df.apply(resec,axis=1,result_type='broadcast')
print(df2)
输出
id date_time
0 73430677 2021-02-27 04:24:00
1 73430688 2021-02-27 04:24:10
2 73430703 2021-02-27 04:24:20
3 73430713 2021-02-27 04:24:30
4 73430718 2021-02-27 04:24:40
5 73430728 2021-02-27 04:24:50
6 73430771 2021-02-27 04:25:00
7 73430818 2021-02-27 04:25:12
8 73430864 2021-02-27 04:25:24
9 73430904 2021-02-27 04:25:36
10 73430942 2021-02-27 04:25:48
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。