【问题标题】:Pandas - extract date from datetime and plus one day if the time passes a certain hourPandas - 从日期时间中提取日期,如果时间超过某个小时,则加一天
【发布时间】:2018-08-09 17:14:38
【问题描述】:

假设我有这个数据框。

import pandas as pd
data = {"Date": ["2018-08-05", "2018-08-05", "2018-08-05", "2018-08-05", "2018-08-06"],  
        "Time_End":["2018-08-05 13:50:00", "2018-08-05 14:26:00", "2018-08-05 17:30:00", "2018-08-05 17:10:00", "2018-08-06 11:23:00"],
        "Reason":["blah1", "blah2", "blah3", "blah4", "blah5"]
       }
df = pd.DataFrame.from_dict(data)
df

        Date             Time_End          Reason
0   2018-08-05      2018-08-05 13:50:00     blah1
1   2018-08-05      2018-08-05 14:26:00     blah2
2   2018-08-05      2018-08-05 17:30:00     blah3
3   2018-08-05      2018-08-05 17:10:00     blah4
4   2018-08-06      2018-08-06 11:23:00     blah5

我只想将“Time_End”中的日期提取到名为“Birth_date”的新列中。但是,我还想检查时间是否超过 17:00。如果是这样,则提取的日期将加一成为第二天。下面显示了所需的输出。

    Date        Birth_date      Time_End            Reason
0   2018-08-05  2018-08-05  2018-08-05 13:50:00     blah1
1   2018-08-05  2018-08-05  2018-08-05 14:26:00     blah2
2   2018-08-05  2018-08-06  2018-08-05 17:30:00     blah3
3   2018-08-05  2018-08-06  2018-08-05 17:10:00     blah4
4   2018-08-06  2018-08-06  2018-08-06 11:23:00     blah5 

我想出了这个,但它没有按我预期的方式工作。

df["after_17"] = df["Time_End"].dt.hour > 17
df["birth_date"] = df["after_17"].map(lambda x: df["Time_End"].dt.date if x  else df["Time_End"].dt.date + pd.DateOffset(1))

它将输出连接在一起并形成一行。如何让它正常工作?我也愿意接受其他类型的解决方案。

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    使用datetime 库中的timedelta 方法将7 小时添加到Time_End,然后使用dt.date 仅提取日期部分。

    import pandas as pd
    from datetime import timedelta
    
    data = {"Date": ["2018-08-05", "2018-08-05", "2018-08-05", "2018-08-05", "2018-08-06"],  
            "Time_End":["2018-08-05 13:50:00", "2018-08-05 14:26:00", "2018-08-05 17:30:00", "2018-08-05 17:10:00", "2018-08-06 11:23:00"],
            "Reason":["blah1", "blah2", "blah3", "blah4", "blah5"]
           }
    
    df = pd.DataFrame.from_dict(data).astype({'Time_End': 'datetime64'})
    
    td = timedelta(hours=7)
    
    df['Birth_Date'] = (df.Time_End + td).dt.date
    

    输出

        Date        Time_End            Reason  Birth_Date
    0   2018-08-05  2018-08-05 13:50:00 blah1   2018-08-05
    1   2018-08-05  2018-08-05 14:26:00 blah2   2018-08-05
    2   2018-08-05  2018-08-05 17:30:00 blah3   2018-08-06
    3   2018-08-05  2018-08-05 17:10:00 blah4   2018-08-06
    4   2018-08-06  2018-08-06 11:23:00 blah5   2018-08-06
    

    【讨论】:

    • 聪明的想法是使用 timedelta 来推动时间。此外,它在语法上很干净。
    【解决方案2】:

    先创建一个 1 天的 DateOffset:

    date_offset = pd.tseries.offsets.DateOffset(n=1)
    df['Birth_date'] = df.Time_End.apply(lambda x: x + date_offset if x.hour >= 17 else x).dt.date
    

    【讨论】:

      【解决方案3】:

      你需要:

      import numpy as np
      import datetime as dt
      import pandas as pd
      data = {"Date": ["2018-08-05", "2018-08-05", "2018-08-05", "2018-08-05", "2018-08-06"],  
              "Time_End":["2018-08-05 13:50:00", "2018-08-05 14:26:00", "2018-08-05 17:30:00", "2018-08-05 17:10:00", "2018-08-06 11:23:00"],
              "Reason":["blah1", "blah2", "blah3", "blah4", "blah5"]
             }
      df = pd.DataFrame(data)
      
      # Convert column into pandas datetime format
      df['Time_End'] = pd.to_datetime(df["Time_End"])
      
      # Create a threshold value to compare
      t = pd.to_datetime('17:00:00').time()
      
      # Use datetime.timedelta to add a day for condition 
      df['Birth_date'] = np.where(df['Time_End'].dt.time < t, df['Time_End'], df["Time_End"] + dt.timedelta(days=1) )
      

      输出:

               Date            Time_End Reason           birthdate
      0  2018-08-05 2018-08-05 13:50:00  blah1 2018-08-05 13:50:00
      1  2018-08-05 2018-08-05 14:26:00  blah2 2018-08-05 14:26:00
      2  2018-08-05 2018-08-05 17:30:00  blah3 2018-08-06 17:30:00
      3  2018-08-05 2018-08-05 17:10:00  blah4 2018-08-06 17:10:00
      4  2018-08-06 2018-08-06 11:23:00  blah5 2018-08-06 11:23:00
      

      【讨论】:

        【解决方案4】:

        您可以先拆分列,然后再进行比较以添加到日期:

        df[['Birth-date', 'Time']] = df['Time_End'].str.split(' ', n=1, expand=True)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-01
          • 2015-06-08
          • 1970-01-01
          • 2020-06-27
          • 2021-02-19
          • 2020-02-01
          • 1970-01-01
          相关资源
          最近更新 更多