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

关联

上面是我使用 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 Seq

M742-021167,20200917,G0005

M359-020535,20200917,G0010

M742-022095,20200917,G0015

M220-001083,20200918,G0400

M742-022390,20200918,G0405

M907-004747,20200918,H0090

M934-005904,20200918,H0095

预期的

MODELCHASS,Prod Date,PL Seq,Time

M742 021167,2020-09-17T,G0005,8:00:00

M359 020535,2020-09-17T,G0010,8:00:01

M742 022095,2020-09-17T,G0015,8:00:02

M220 001083,2020-09-18T,G0400,8:00:00

M742 022390,2020-09-18T,G0405,8:00:01

M907 004747,2020-09-18T,H0090,8:00:00

M934 005904,2020-09-18T,H0095,8:00:01

@Trenton 我们可以修改这个如果 H 订单与 G 订单的日期相同


第 6 行中的当前编辑

MODELCHASS,Prod Date,PL Seq

M742-021167,20200917,G0005

M359-020535,20200917,G0010

M742-022095,20200917,G0015

M220-001083,20200918,G0400

M742-022390,20200918,G0405

M907-004747,20200917,H0090

M934-005904,20200917,H0095

预期编辑

MODELCHASS,Prod Date,PL Seq,Time

M742 021167,2020-09-17T,G0005,8:00:00

M359 020535,2020-09-17T,G0010,8:00:01

M742 022095,2020-09-17T,G0015,8:00:02

M220 001083,2020-09-18T,G0400,8:00:00

M742 022390,2020-09-18T,G0405,8:00:01

M907 004747,2020-09-17T,H0090,8:00:00

M934 005904,2020-09-17T,H0095,8:00:01


MM们
浏览 141回答 1
1回答

繁花如伊

将列转换'Prod Date'为日期时间对数据帧进行排序'Prod Date','PL Seq'因此'df'与加入的顺序相同time_seq。答案的主要部分是创建一个包含和 的DateRange列表.groupby.apply.groupby和Prod 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 中的第一个值start:x.values[0]的数量periods是len[x]是freq,'s'几秒钟。这将创建一个DateRange,从中提取时间.time测试于python 3.10,pandas 1.4.3import pandas as pd# setup test dataframedata = {'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 columndf['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 orderdf = 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 dataframetime_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 dfdf_new = df.join(time_seq.time_seq)# display(df_new)    MODELCHASS  Prod Date PL Seq  time_seq0  M742-021167 2020-09-17  G0005  08:00:001  M359-020535 2020-09-17  G0010  08:00:012  M742-022095 2020-09-17  G0015  08:00:023  M220-001083 2020-09-18  G0400  08:00:004  M742-022390 2020-09-18  G0405  08:00:015  M907-004747 2020-09-18  H0090  08:00:006  M934-005904 2020-09-18  H0095  08:00:01
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python