Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 制定第一个事件和最后一个事件_Python_Pandas_Datetime_Dataframe_Events - Fatal编程技术网

Python 制定第一个事件和最后一个事件

Python 制定第一个事件和最后一个事件,python,pandas,datetime,dataframe,events,Python,Pandas,Datetime,Dataframe,Events,我正在处理一些带有日期时间的事件数据。每个事件gsm\u ID列都有一个ID。对于每个事件,都有一个开始日期和时间matchdatetime列。将发生多个事件,并由列eventdatetime表示。还有一个列记录PreviousEventTime列。如何创建一个新列来记录以下内容:1)每个“gsm_ID”的第一个事件,其中matchdatetime列和PreviousEventTime列是相同的2)每个gsm_ID的最后一个事件,其中“eventdatetime”是最新的 gsm_id

我正在处理一些带有日期时间的事件数据。每个事件gsm\u ID列都有一个ID。对于每个事件,都有一个开始日期和时间matchdatetime列。将发生多个事件,并由列eventdatetime表示。还有一个列记录PreviousEventTime列。如何创建一个新列来记录以下内容:1)每个“gsm_ID”的第一个事件,其中matchdatetime列和PreviousEventTime列是相同的2)每个gsm_ID的最后一个事件,其中“eventdatetime”是最新的

    gsm_id   eventdatetime  matchdatetime   PreviousEventTime
    2462794 8/11/2017 18:46 8/11/2017 18:45 8/11/2017 18:45
    2462794 8/11/2017 18:49 8/11/2017 18:45 8/11/2017 18:46
    2462794 8/11/2017 19:13 8/11/2017 18:45 8/11/2017 18:49
    2462794 8/11/2017 19:31 8/11/2017 18:45 8/11/2017 19:13
    2462794 8/11/2017 19:40 8/11/2017 18:45 8/11/2017 19:31
    2462794 8/11/2017 20:07 8/11/2017 18:45 8/11/2017 19:40
    2462794 8/11/2017 20:09 8/11/2017 18:45 8/11/2017 20:07
    2462796 8/12/2017 14:23 8/12/2017 14:00 8/12/2017 14:00
    2462796 8/12/2017 14:38 8/12/2017 14:00 8/12/2017 14:23
    2462796 8/12/2017 14:42 8/12/2017 14:00 8/12/2017 14:38
    2462796 8/12/2017 15:08 8/12/2017 14:00 8/12/2017 14:42
    2462796 8/12/2017 15:27 8/12/2017 14:00 8/12/2017 15:08
    2462795 8/12/2017 17:39 8/12/2017 16:30 8/12/2017 16:30
    2462795 8/12/2017 17:44 8/12/2017 16:30 8/12/2017 17:39
有人能给我出个主意吗? 如果您希望加载该文件,请下载以下文件:

您可以使用:

In [203]: s1 = df[df['PreviousEventTime'] == df['matchdatetime']].groupby('gsm_id')['eventdatetime'].first()

In [204]: s1
Out[204]: 
gsm_id
2462794   2017-08-11 18:46:00
2462795   2017-08-12 17:39:00
2462796   2017-08-12 14:23:00
Name: eventdatetime, dtype: datetime64[ns]

In [205]: s2 = df.groupby('gsm_id')['eventdatetime'].last()

In [206]: s2
Out[206]: 
gsm_id
2462794   2017-08-11 20:09:00
2462795   2017-08-12 17:44:00
2462796   2017-08-12 15:27:00
Name: eventdatetime, dtype: datetime64[ns]
最后:

df.set_index('gsm_id').assign(myfirst=s1, mylast=s2).reset_index()

这两个问题都可以使用pandas groupby对象

问题1) 首先找到matchdatetime和PreviousEventTime相等的索引,然后按“gsm_id”分组。最后按“First”函数聚合:

first_equal_dates = df[df['PreviousEventTime'] == df['matchdatetime']].groupby('gsm_id')['eventdatetime'].first()
然后,您可以在原始数据帧上合并/加入此数据帧

问题2) 同样,只需按“gsm_id”分组,但使用“last”功能:

import pandas as pd
data = pd.read_csv('Data_test.csv')
last_event_dates = data.groupby('gsm_id').agg({'eventdatetime': 'last'})
同样,如果您希望它作为数据帧中的一列,只需在原始数据帧上合并/连接它

您也可以只指定一行中的结果:

data.set_index('gsm_id').assign(question_1=first_equal_dates, mylast=last_event_dates).reset_index()

感谢Lilistence,它可以工作。我想将first event和last event都放在一个新列中,并将datestime替换为字符串“first_event”,将“last event”替换为字符串“first_event”,将最后一行改为
df.set_index('gsm_id')。赋值(**{“first_event”:s1,“last event”:s2})。重置_index()
。请不要忘记那些有用的答案。嗨,Lilistence,我正在尝试创建两个新列
df['First-Event']=s1
dr['Last\u Event']=s2
它在两个新列中都向我显示了NaT。您能告诉我哪里出了问题吗Thanks@Zephyr请严格按照答案中的步骤操作,测试没有任何问题。您可能忘记了
set_index()
或其他什么。我也设置了索引。谢谢mfavs。它可以工作。我想将first event和last event都放在一个新列中,并将datestime替换为字符串“first_event”(第一个事件)和“last event”(最后一个事件)。您介意建议吗?
data.set_index('gsm_id').assign(question_1=first_equal_dates, mylast=last_event_dates).reset_index()