根据时间戳和不同的位置创建会话

时间:2018-12-09 17:33:59

标签: python pandas numpy

我想基于位置和时间戳创建会话。如果位置是新的或时间超过了 15分钟间隔,则将新会话分配给数据框中的记录。下面的例子

for (int i = 0; i < args.length; i += 2)

这是对特定问题不起作用的代码。

Location      |               Time                  |     Session
    A                   2016-01-01 00:00:15                  1
    A                   2016-01-01 00:05:00                  1
    A                   2016-01-01 00:10:08                  1
    A                   2016-01-01 00:14:08                  1
    A                   2016-01-01 00:15:49                  2     
    B                   2016-01-01 00:15:55                  3
    C                   2016-01-01 00:15:58                  4
    C                   2016-01-01 00:26:55                  4
    C                   2016-01-01 00:29:55                  4
    C                   2016-01-01 00:31:08                  5

如果要查找新位置或当前位置需要15分钟,我想进行一次新会话。

1 个答案:

答案 0 :(得分:1)

您既可以[Route("/Company/{Id}", "GET")] public class GetCompaniesById : IReturn<GetCompaniesFlatTree> { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public int? ParentId { get; set; } } [Route("/CompaniesFlatTree", "GET")] public class GetCompaniesFlatTree : IReturn<GetCompaniesFlatTree> { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public int? ParentId { get; set; } } [Route("/CompaniesTree", "GET")] public class GetCompaniesTree : IReturn<Company>{} public class DTOServiceStackBase { public ResponseStatus ResponseStatus { get; set; } //Automatic exception handling } public class Company : DTOServiceStackBase { [AutoIncrement] [PrimaryKey] public int Id { get; set; } [Required] public string Name { get; set; } public string Address { get; set; } public int? ParentId { get; set; } [IgnoreDataMember] public List<Company> SubCompanies { get; set; } } [Authenticate] public class CompanyService : Service { /// <summary> /// Calling SQL directly and casting to the GetCompaniesFlatTree object /// Don't do this methond of direct SQL unless you cannot do it any other way /// Why?? Becuase the SQL is not automatically updated when we updated the database schema /// </summary> /// <param name="request"></param> /// <returns></returns> public object Get(GetCompaniesFlatTree request) { //This retun uses the DB.Select and works correctly //return Db.Select<GetCompaniesFlatTree>($"SELECT SC.* FROM Company C Join Company SC ON SC.ParentId = C.Id Where C.ID = {request.Id}"); //This query uses Db.Query due to the BEGIN and CTE Usage //This does not work with SQL in Memory because it does not support CTE Statements return Db.Query<GetCompaniesFlatTree>("BEGIN WITH q AS ( SELECT * FROM [Company] WHERE ParentId IS NULL UNION ALL SELECT m.* FROM [Company] m JOIN q ON m.parentId = q.Id) SELECT * FROM q END;"); } /// <summary> /// Table Alias is required in this Select due to the self join on company. /// Table Alisa allows the join to specify which table to return the data from. /// </summary> /// <param name="request"></param> /// <returns></returns> public object Get(GetCompaniesById request) { var q = Db.From<Company>(Db.TableAlias("c1")) .Join<Company>((ChildComp, ParentCompany) => ChildComp.Id == ParentCompany.ParentId && ParentCompany.Id == request.Id, Db.TableAlias("c2")).Select<Company>(p => new {Id = Sql.TableAlias(p.Id, "c2"), Name = Sql.TableAlias(p.Name, "c2")}); var results = Db.Select<GetCompaniesById>(q); //See the SQL that was generated var lastSql = Db.GetLastSql(); return results; } /// <summary> /// Get all Compaines and build the hierarchy /// </summary> /// <param name="request"></param> /// <returns></returns> public object Get(GetCompaniesTree request) { //Get all companies var results = Db.Select<Company>(); //Get Top node Company topCompany = results.Single(x => x.ParentId == null); //Find all children var allChildrenRecursive = GetAllChildrenRecursive(topCompany, results); return allChildrenRecursive; } /// <summary> /// Populates a Companies collection of child companies /// </summary> /// <param name="parent"></param> /// <param name="results"></param> /// <returns></returns> private Company GetAllChildrenRecursive(Company parent, List<Company> results) { List<Company> retVal = new List<Company>(); retVal.Add(parent); //Get Children var children = results.Where(x => x.ParentId == parent.Id).ToList(); parent.SubCompanies = children; foreach (var child in children) { GetAllChildrenRecursive(child, results); } return parent; } } groupby,也可以使用pd.Grouper将间隔分为15分钟和位置,然后使用ngroup对每个组进行编号:

Location