微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

For 循环在日期时间列中计算分钟并附加到秒

如何解决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/(重复分钟数)),将秒值附加到日期时间列。

Target datetime column

我欢迎任何实用的解决方案!!!!

解决方法

  • 修改了您的示例数据,使一组 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?