Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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 熊猫-从datetime中提取日期,如果时间超过某个小时,则加上一天_Python_Pandas_Datetime - Fatal编程技术网

Python 熊猫-从datetime中提取日期,如果时间超过某个小时,则加上一天

Python 熊猫-从datetime中提取日期,如果时间超过某个小时,则加上一天,python,pandas,datetime,Python,Pandas,Datetime,假设我有这个数据帧 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:

假设我有这个数据帧

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\u End”提取到一个名为“Birth\u 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))

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

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

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

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) )

使用
datetime
库中的
timedelta
方法向
Time\u End
添加7个小时,然后使用
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

首先创建1天的日期偏移量:

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

使用timedelta将时间向前推的好主意。此外,它在语法上是干净的。
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