두 판다 열 사이의 시간 차이(시간 및 분) 계산
난 두 개의 칼럼이 있어요fromdate
그리고.todate
데이터 프레임에서
import pandas as pd
data = {'todate': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000'), pd.Timestamp('2014-01-23 10:07:47.660000')],
'fromdate': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000'), pd.Timestamp('2014-01-23 18:50:41.420000')]}
df = pd.DataFrame(data)
새 열을 추가합니다.diff
사용하여 두 날짜 간의 차이를 찾다
df['diff'] = df['fromdate'] - df['todate']
알겠습니다.diff
열, 하지만 다음을 포함합니다.days
24시간 이상이 있을 때.
todate fromdate diff
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.870 2 days 10:38:09.820000
1 2014-01-27 11:57:18.240 2014-01-27 15:38:22.540 0 days 03:41:04.300000
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.420 0 days 08:42:53.760000
결과를 시간과 분(즉, 일을 시간으로 변환)으로만 변환하려면 어떻게 해야 합니까?
판다 타임스탬프 차이는 datetime.timedelta 개체를 반환합니다.*as_type* 방법을 사용하면 쉽게 시간으로 변환할 수 있습니다.
import pandas
df = pandas.DataFrame(columns=['to','fr','ans'])
df.to = [pandas.Timestamp('2014-01-24 13:03:12.050000'), pandas.Timestamp('2014-01-27 11:57:18.240000'), pandas.Timestamp('2014-01-23 10:07:47.660000')]
df.fr = [pandas.Timestamp('2014-01-26 23:41:21.870000'), pandas.Timestamp('2014-01-27 15:38:22.540000'), pandas.Timestamp('2014-01-23 18:50:41.420000')]
(df.fr-df.to).astype('timedelta64[h]')
양보하기 위해,
0 58
1 3
2 8
dtype: float64
이것은 나를 미치게 했습니다..astype()
위의 해결책은 저에게 효과가 없었습니다.하지만 다른 방법을 찾았어요시간을 재지는 않았지만 다른 사람들에게 도움이 될 수도 있습니다.
t1 = pd.to_datetime('1/1/2015 01:00')
t2 = pd.to_datetime('1/1/2015 03:30')
print pd.Timedelta(t2 - t1).seconds / 3600.0
...시간을 원한다면요또는:
print pd.Timedelta(t2 - t1).seconds / 60.0
...몇 분만 원하신다면요.
업데이트: 이전에는 다음을 사용하여 언급한 유용한 의견이 있었습니다..total_seconds()
여러 날에 걸친 기간 동안.그것이 사라졌기 때문에, 나는 답을 업데이트했습니다.
- 결과를 몇 시간과 몇 분으로 변환하려면 어떻게 해야 합니까?
- 승인된 답변만 반환됩니다.
days + hours
분은 포함되지 않습니다.
- 승인된 답변만 반환됩니다.
- 시간 및 분이 다음과 같은 열을 제공하는 방법
hh:mm
또는x hours y minutes
추가 계산 및 문자열 형식이 필요합니다. - 이 답변은 다음을 사용하여 총 시간 또는 총 분을 플로트로 얻는 방법을 보여줍니다.
timedelta
수학, 그리고 사용하는 것보다 빠릅니다..astype('timedelta64[h]')
.- 다음과 같이,
.astype('timedelta64[h]')
허용되지 않습니다.
- 다음과 같이,
- Pandas Time Deltas 사용 설명서
- Pandas 시계열/날짜 기능 사용 설명서
- python 객체:지원되는 작업을 참조하십시오.
- 다음 샘플 데이터는 이미 다음과 같습니다.
datetime64[ns] dtype
모든 관련 열은 를 사용하여 변환해야 합니다. - 테스트 대상
python 3.11.2
,pandas 2.0.1
,numpy 1.24.3
import pandas as pd
# test data from OP, with values already in a datetime format
data = {'to_date': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000'), pd.Timestamp('2014-01-23 10:07:47.660000')],
'from_date': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000'), pd.Timestamp('2014-01-23 18:50:41.420000')]}
# test dataframe; the columns must be in a datetime format; use pandas.to_datetime if needed
df = pd.DataFrame(data)
# add a timedelta column if wanted. It's added here for information only
# df['time_delta_with_sub'] = df.from_date.sub(df.to_date) # also works
df['time_delta'] = (df.from_date - df.to_date)
# create a column with timedelta as total hours, as a float type
df['tot_hour_diff'] = (df.from_date - df.to_date) / pd.Timedelta(hours=1)
# create a colume with timedelta as total minutes, as a float type
df['tot_mins_diff'] = (df.from_date - df.to_date) / pd.Timedelta(minutes=1)
# display(df)
to_date from_date time_delta tot_hour_diff tot_mins_diff
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.870 2 days 10:38:09.820000 58.636061 3518.163667
1 2014-01-27 11:57:18.240 2014-01-27 15:38:22.540 0 days 03:41:04.300000 3.684528 221.071667
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.420 0 days 08:42:53.760000 8.714933 522.896000
기타 방법
- 기타 리소스의 팟캐스트에서 주의할 사항,
.total_seconds()
핵심 개발자가 휴가 중일 때 추가 및 병합되었으며 승인되지 않았을 것입니다.- 이것이 또한 다른 사람들이 없는 이유입니다.
.total_xx
방법들.
- 이것이 또한 다른 사람들이 없는 이유입니다.
# convert the entire timedelta to seconds
# this is the same as td / timedelta(seconds=1)
(df.from_date - df.to_date).dt.total_seconds()
[out]:
0 211089.82
1 13264.30
2 31373.76
dtype: float64
# get the number of days
(df.from_date - df.to_date).dt.days
[out]:
0 2
1 0
2 0
dtype: int64
# get the seconds for hours + minutes + seconds, but not days
# note the difference from total_seconds
(df.from_date - df.to_date).dt.seconds
[out]:
0 38289
1 13264
2 31373
dtype: int64
기타 리소스
- 톡 파이썬 투 미: 에피소드 #271: 시간의 신비, 파이썬의 데이트 시간을 풀어보세요!
- 실제 파이썬:Python datetime을 사용하여 날짜 및 시간 작업
- 이 모듈은 표준 모듈에 강력한 확장 기능을 제공합니다.
%%timeit
을 하다
import pandas as pd
# dataframe with 2M rows
data = {'to_date': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000')], 'from_date': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000')]}
df = pd.DataFrame(data)
df = pd.concat([df] * 1000000).reset_index(drop=True)
%timeit (df.from_date - df.to_date) / pd.Timedelta(hours=1)
[out]:
24.2 ms ± 2.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit (df.from_date - df.to_date).astype('timedelta64[h]')
[out]:
ValueError: Cannot convert from timedelta64[ns] to timedelta64[D]. Supported resolutions are 's', 'ms', 'us', 'ns'
기본적으로 판다의 시간 차이는 나노초 해상도입니다.timedelta64[ns]
따라서 초/분/시간/등으로 변환하는 한 가지 방법은 나노초 표현을 다음과 같이 나누는 것입니다.10**9
초로 변환하려면 다음과 같이 하십시오.60*10**9
분간 등이 방법은 이 1페이지에 제시된 다른 방법보다 최소 3배 이상 빠릅니다.
df['diff_in_seconds'] = df['from_date'].sub(df['to_date']).view('int64') // 10**9
df['diff_in_minutes'] = df['from_date'].sub(df['to_date']).view('int64') // (60*10**9)
df['diff_in_hours'] = df['from_date'].sub(df['to_date']).view('int64') // (3600*10**9)
의 차이를 원하는 것으로 가정하여 나눗셈(PS: 위의코정나초전위사체, 분시원다가고차니한합, 정간의등를다이해기하을)을 사용합니다.//
/
즉 초를 더 해상도/시간 등로 하는 것을 고려해 보십시오.
1 Trenton McKinney 설정을 사용하는 일부 벤치마크:
data = {'to_date': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000')]*1000000,
'from_date': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000')]*1000000}
df = pd.DataFrame(data)
df['Diff'] = df['from_date'] - df['to_date']
%timeit df['Diff'].view('int64') // (3600*10**9)
# 11 ms ± 271 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df['Diff'] // pd.Timedelta(hours=1)
# 36.7 ms ± 2.99 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df['Diff'].astype('timedelta64[h]')
# 46.5 ms ± 865 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df['Diff'].dt.total_seconds() // 3600
# 169 ms ± 7.71 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
언급URL : https://stackoverflow.com/questions/22923775/calculate-time-difference-between-two-pandas-columns-in-hours-and-minutes
'programing' 카테고리의 다른 글
Python의 목록에서 각 튜플의 첫 번째 요소 가져오기 (0) | 2023.07.16 |
---|---|
마운트된 수명 주기 후크의 비동기 대기 (0) | 2023.07.16 |
Pandas/NumPy에서 열/변수가 숫자인지 여부를 확인하는 방법은 무엇입니까? (0) | 2023.07.16 |
그래프QL 큰 정수 오류:Int는 32비트 부호가 없는 정수 값을 나타낼 수 없습니다. (0) | 2023.07.16 |
파이썬에서 이미지의 exif 데이터를 읽으려면 어떻게 해야 합니까? (0) | 2023.07.16 |