为了账号安全,请及时绑定邮箱和手机立即绑定

如何基于组添加时间序列列

如何基于组添加时间序列列

MM们 2023-09-05 20:16:50
关联上面是我使用 python 修改的 CSV 文件示例的链接,我需要添加一个时间列,如果前一行的日期匹配,则该时间列增加 1。如果日期更改,时间将从 8:00:00 重新开始此外,如果“PL Seq”从 G* 更改为 H*,时间也会从 8 重新开始。我觉得我的逻辑已经很清晰了,只是写起来有点困难。向 df 'Time' 添加一列,将第一个 'Time' 值设置为 8:00:00读取 df 中的每一行如果日期值 = 上一行的日期值且 pl seq 值第一个字符 = 第一个字符,则将时间值设置为时间 +1否则将时间值设置为时间*请注意,我已经有了更改订单 # 的格式和目标状态日期的代码当前的MODELCHASS,Prod Date,PL SeqM742-021167,20200917,G0005M359-020535,20200917,G0010M742-022095,20200917,G0015M220-001083,20200918,G0400M742-022390,20200918,G0405M907-004747,20200918,H0090M934-005904,20200918,H0095预期的MODELCHASS,Prod Date,PL Seq,TimeM742 021167,2020-09-17T,G0005,8:00:00M359 020535,2020-09-17T,G0010,8:00:01M742 022095,2020-09-17T,G0015,8:00:02M220 001083,2020-09-18T,G0400,8:00:00M742 022390,2020-09-18T,G0405,8:00:01M907 004747,2020-09-18T,H0090,8:00:00M934 005904,2020-09-18T,H0095,8:00:01@Trenton 我们可以修改这个如果 H 订单与 G 订单的日期相同第 6 行中的当前编辑MODELCHASS,Prod Date,PL SeqM742-021167,20200917,G0005M359-020535,20200917,G0010M742-022095,20200917,G0015M220-001083,20200918,G0400M742-022390,20200918,G0405M907-004747,20200917,H0090M934-005904,20200917,H0095预期编辑MODELCHASS,Prod Date,PL Seq,TimeM742 021167,2020-09-17T,G0005,8:00:00M359 020535,2020-09-17T,G0010,8:00:01M742 022095,2020-09-17T,G0015,8:00:02M220 001083,2020-09-18T,G0400,8:00:00M742 022390,2020-09-18T,G0405,8:00:01M907 004747,2020-09-17T,H0090,8:00:00M934 005904,2020-09-17T,H0095,8:00:01
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

  • 将列转换'Prod Date'为日期时间

  • 对数据帧进行排序'Prod Date''PL Seq'因此'df'与加入的顺序相同time_seq

  • 答案的主要部分是创建一个包含和 的DateRange列表.groupby.apply

  • .groupbyProd Date第一个元素'PL Seq'

    • df.groupby(['Prod Date', df['PL Seq'].str[0]])

  • .apply(lambda x: (pd.date_range(start=x.values[0] + pd.Timedelta(hours=8), periods=len(x), freq='s')).time)

    • 到目前为止,添加 8 小时的 Timedelta,以获得08:00:00

    • 对于每个组,使用 x 中的第一个值startx.values[0]

    • 的数量periodslen[x]

    • freq's'几秒钟。

    • 这将创建一个DateRange,从中提取时间.time

  • 测试于python 3.10,pandas 1.4.3

import pandas as pd


# setup test dataframe

data = {'MODELCHASS': ['M742-021167', 'M359-020535', 'M742-022095', 'M220-001083', 'M742-022390', 'M907-004747', 'M934-005904'],

        'Prod Date': [20200917, 20200917, 20200917, 20200918, 20200918, 20200918, 20200918],

        'PL Seq': ['G0005', 'G0010', 'G0015', 'G0400', 'G0405', 'H0090', 'H0095']}


df = pd.DataFrame(data)


# convert Prod Date to a datetime column

df['Prod Date'] = pd.to_datetime(df['Prod Date'], format='%Y%m%d')


# sort the dataframe by values so the order will correspond to the groupby order

df = df.sort_values(['Prod Date', 'PL Seq']).reset_index(drop=True)


# groupby Prod Date and the first character of PL Seq

# create a DateRange sequence for each group

# reshape the dataframe

time_seq = (df.groupby(['Prod Date', df['PL Seq'].str[0]])['Prod Date']

            .apply(lambda x: (pd.date_range(start=x.values[0] + pd.Timedelta(hours=8), periods=len(x), freq='s')).time)

            .reset_index(name='time_seq')

            .explode('time_seq', ignore_index=True))


# join the time_seq column to df

df_new = df.join(time_seq.time_seq)


# display(df_new)

    MODELCHASS  Prod Date PL Seq  time_seq

0  M742-021167 2020-09-17  G0005  08:00:00

1  M359-020535 2020-09-17  G0010  08:00:01

2  M742-022095 2020-09-17  G0015  08:00:02

3  M220-001083 2020-09-18  G0400  08:00:00

4  M742-022390 2020-09-18  G0405  08:00:01

5  M907-004747 2020-09-18  H0090  08:00:00

6  M934-005904 2020-09-18  H0095  08:00:01


查看完整回答
反对 回复 2023-09-05
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信