问题
I am using python to calculate time intervals between two events. Each event has a 'beginning time' and an 'ending time.' I have found the difference between the two in a new column, 'interval', but have negative values when the beginning and ending time are on different days (for instance begin 23:46:00 and end 00:21:00 gives -23:25:00). I would like to create an if-statement to run through the 'interval' column and add 24 hours to any negative values. However, I have had problems with adding 24 hours to the 'interval' values. Currently my 'interval' dtype=timedelta64[ns].
Here is a little bit of the table to clarify the problem:
CallDate BeginningTime EndingTime Interval
75 1/8/2009 1900-01-01 07:49:00 1900-01-01 08:19:00 00:30:00
76 1/11/2009 1900-01-01 14:37:00 1900-01-01 14:59:00 00:22:00
77 1/9/2009 1900-01-01 09:29:00 1900-01-01 09:56:00 00:27:00
78 1/11/2009 1900-01-01 09:20:00 1900-01-01 10:13:00 00:53:00
79 1/16/2009 1900-01-01 15:11:00 1900-01-01 15:50:00 00:39:00
80 1/17/2009 1900-01-01 22:52:00 1900-01-01 23:26:00 00:34:00
81 1/19/2009 1900-01-01 05:48:00 1900-01-01 06:32:00 00:44:00
82 1/20/2009 1900-01-01 23:46:00 1900-01-01 00:21:00 -23:25:00
83 1/20/2009 1900-01-01 21:29:00 1900-01-01 22:08:00 00:39:00
84 1/23/2009 1900-01-01 07:33:00 1900-01-01 07:55:00 00:22:00
85 1/30/2009 1900-01-01 19:33:00 1900-01-01 20:01:00 00:28:00
Update: Here is the code that had led me to this point
df['BeginningTime']=pd.to_datetime(df['BeginningTime'], format='%H:%M')
df['EndingTime']=pd.to_datetime(df['EndingTime'], format='%H:%M')
df['Interval']=df['EndingTime']-df['BeginningTime']
df[['CallDate','BeginningTime','EndingTime','Interval']]
回答1:
If you just want to add 1 day to the timedelta if it is negative:
df['Interval']=df['Interval'].apply(lambda x: x + Timedelta(days=1) if x < 0 else x)
If it is safe to make the assumption that the end time will be within 24 hours, you can check to see if the end time is earlier than the start time and use timedelta to add a day to the end time rather than the interval time.
from datetime import datetime, timedelta
d1 = datetime.strptime( "1900-01-01 23:46:00", "%Y-%m-%d %H:%M:%S" )
d2 = datetime.strptime( "1900-01-01 00:21:00", "%Y-%m-%d %H:%M:%S" )
if d2 < d1:
d2 += timedelta(days=1)
print d2 - d1
# 0:35:00
With pandas you can do something like this:
import pandas as pd
from pandas import Timedelta
d = {
"CallDate": [
"1/8/2009",
"1/11/2009",
"1/9/2009",
"1/11/2009",
"1/16/2009",
"1/17/2009",
"1/19/2009",
"1/20/2009",
"1/20/2009",
"1/23/2009",
"1/30/2009"
],
"BeginningTime": [
"1900-01-01 07:49:00",
"1900-01-01 14:37:00",
"1900-01-01 09:29:00",
"1900-01-01 09:20:00",
"1900-01-01 15:11:00",
"1900-01-01 22:52:00",
"1900-01-01 05:48:00",
"1900-01-01 23:46:00",
"1900-01-01 21:29:00",
"1900-01-01 07:33:00",
"1900-01-01 19:33:00"
],
"EndingTime": [
"1900-01-01 08:19:00",
"1900-01-01 14:59:00",
"1900-01-01 09:56:00",
"1900-01-01 10:13:00",
"1900-01-01 15:50:00",
"1900-01-01 23:26:00",
"1900-01-01 06:32:00",
"1900-01-01 00:21:00",
"1900-01-01 22:08:00",
"1900-01-01 07:55:00",
"1900-01-01 20:01:00"
]
}
df = pd.DataFrame(data=d)
df['BeginningTime']=pd.to_datetime(df['BeginningTime'], format="%Y-%m-%d %H:%M:%S")
df['EndingTime']=pd.to_datetime(df['EndingTime'], format="%Y-%m-%d %H:%M:%S")
def interval(x):
if x['EndingTime'] < x['BeginningTime']:
x['EndingTime'] += Timedelta(days=1)
return x['EndingTime'] - x['BeginningTime']
df['Interval'] = df.apply(interval, axis=1)
In [2]: df
Out[2]:
BeginningTime CallDate EndingTime Interval
0 1900-01-01 07:49:00 1/8/2009 1900-01-01 08:19:00 00:30:00
1 1900-01-01 14:37:00 1/11/2009 1900-01-01 14:59:00 00:22:00
2 1900-01-01 09:29:00 1/9/2009 1900-01-01 09:56:00 00:27:00
3 1900-01-01 09:20:00 1/11/2009 1900-01-01 10:13:00 00:53:00
4 1900-01-01 15:11:00 1/16/2009 1900-01-01 15:50:00 00:39:00
5 1900-01-01 22:52:00 1/17/2009 1900-01-01 23:26:00 00:34:00
6 1900-01-01 05:48:00 1/19/2009 1900-01-01 06:32:00 00:44:00
7 1900-01-01 23:46:00 1/20/2009 1900-01-01 00:21:00 00:35:00
8 1900-01-01 21:29:00 1/20/2009 1900-01-01 22:08:00 00:39:00
9 1900-01-01 07:33:00 1/23/2009 1900-01-01 07:55:00 00:22:00
10 1900-01-01 19:33:00 1/30/2009 1900-01-01 20:01:00 00:28:00
来源:https://stackoverflow.com/questions/29907529/add-24-hours-to-a-negative-time-difference-in-python