[python] datetime, Timestamp 및 datetime64 간 변환
numpy.datetime64
객체를 datetime.datetime
(또는 Timestamp
) 로 어떻게 변환 합니까?
다음 코드에서는 datetime, timestamp 및 datetime64 객체를 만듭니다.
import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)
In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)
In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>
In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')
참고 : 타임 스탬프에서 날짜 / 시간을 쉽게 얻을 수 있습니다.
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
그러나 우리는 어떻게 추출 할 datetime
또는 Timestamp
A로부터 numpy.datetime64
( dt64
)?
.
업데이트 : 내 데이터 세트의 다소 불쾌한 예 (아마도 동기 부여 예)는 다음과 같습니다.
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
이어야 datetime.datetime(2002, 6, 28, 1, 0)
하고 길지 않아야합니다 (!) ( 1025222400000000000L
) …
답변
numpy.datetime64
UTC로 시간을 나타내는 datetime 객체 로 변환하려면 numpy-1.8
다음 을 수행하십시오 .
>>> from datetime import datetime
>>> import numpy as np
>>> dt = datetime.utcnow()
>>> dt
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> dt64 = np.datetime64(dt)
>>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
>>> ts
1354650685.3624549
>>> datetime.utcfromtimestamp(ts)
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> np.__version__
'1.8.0.dev-7b75899'
위의 예제는 순진한 datetime 객체 np.datetime64
를 UTC로 시간으로 해석한다고 가정합니다 .
datetime을 np.datetime64로 변환하고 뒤로 ( numpy-1.6
) 변환하려면
>>> np.datetime64(datetime.utcnow()).astype(datetime)
datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)
단일 np.datetime64 객체와 np.datetime64의 numpy 배열 모두에서 작동합니다.
np.datetime64를 np.int8, np.int16 등과 같은 방식으로 생각하고 동일한 메소드를 적용하여 int, datetime 및 해당하는 numpy 객체와 같은 Python 객체 사이를 변환하십시오.
“불쾌한 예”가 올바르게 작동합니다.
>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
datetime.datetime(2002, 6, 28, 0, 0)
>>> numpy.__version__
'1.6.2' # current version available via pip install numpy
설치된 long
값을 다음 numpy-1.8.0
과 같이 재현 할 수 있습니다 .
pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev
같은 예 :
>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
1025222400000000000L
>>> numpy.__version__
'1.8.0.dev-7b75899'
그것은 반환 long
을위한 때문에 numpy.datetime64
유형 .astype(datetime)
에 해당 .astype(object)
하는 수익률 파이썬 정수 ( long
에) numpy-1.8
.
날짜 시간 객체를 얻으려면 다음을 수행하십시오.
>>> dt64.dtype
dtype('<M8[ns]')
>>> ns = 1e-9 # number of seconds in a nanosecond
>>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
datetime.datetime(2002, 6, 28, 0, 0)
초를 직접 사용하는 datetime64를 얻으려면 다음을 수행하십시오.
>>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
>>> dt64.dtype
dtype('<M8[s]')
>>> datetime.utcfromtimestamp(dt64.astype(int))
datetime.datetime(2002, 6, 28, 0, 0)
NumPy와 문서는 날짜 시간 API 실험과 미래 NumPy와 버전에서 변경 될 수 있음을 말한다.
답변
pd.Timestamp 생성자를 사용할 수 있습니다. 다음 다이어그램은이 질문과 관련 질문에 유용 할 수 있습니다.
답변
지옥에 온 걸 환영 해
datetime64 객체를 pandas.Timestamp
다음으로 전달할 수 있습니다 .
In [16]: Timestamp(numpy.datetime64('2012-05-01T01:00:00.000000'))
Out[16]: <Timestamp: 2012-05-01 01:00:00>
NumPy 1.6.1에서는 이것이 제대로 작동하지 않는 것으로 나타났습니다.
numpy.datetime64('2012-05-01T01:00:00.000000+0100')
또한 pandas.to_datetime
사용할 수 있습니다 (개발 버전이 아니므로 v0.9.1을 확인하지 않았습니다).
In [24]: pandas.to_datetime('2012-05-01T01:00:00.000000+0100')
Out[24]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))
답변
파이썬의 datetime 모듈, numpy의 datetime64 / timedelta64 및 팬더의 Timestamp / Timedelta 객체 사이의 관계를 더 잘 설명하기 위해 더 통합 된 노력이있을 수 있다고 생각합니다.
파이썬의 날짜 / 시간 표준 라이브러리
날짜 시간 표준 라이브러리에는 네 가지 주요 객체가 있습니다
- 시간-시간, 분, 초 및 마이크로 초로 측정 된 시간 만
- 날짜-년, 월 및 일만
- datetime-시간 및 날짜의 모든 구성 요소
- timedelta-최대 일 단위의 시간
이 네 가지 객체를 만듭니다
>>> import datetime
>>> datetime.time(hour=4, minute=3, second=10, microsecond=7199)
datetime.time(4, 3, 10, 7199)
>>> datetime.date(year=2017, month=10, day=24)
datetime.date(2017, 10, 24)
>>> datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 24, 4, 3, 10, 7199)
>>> datetime.timedelta(days=3, minutes = 55)
datetime.timedelta(3, 3300)
>>> # add timedelta to datetime
>>> datetime.timedelta(days=3, minutes = 55) + \
datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 27, 4, 58, 10, 7199)
NumPy의 datetime64 및 timedelta64 객체
NumPy에는 별도의 날짜 및 시간 객체가 없으며 단일 시점을 나타내는 단일 datetime64 객체 만 있습니다. datetime 모듈의 datetime 객체는 마이크로 초 정밀도 (백만 분의 1 초)입니다. NumPy의 datetime64 객체를 사용하면 시간에서 아토초 (10 ^ -18)까지 정밀도를 설정할 수 있습니다. 생성자가 더 유연하고 다양한 입력을 취할 수 있습니다.
NumPy의 datetime64 및 timedelta64 객체 생성
단위 문자열을 정수로 전달하십시오. 여기에서 모든 장치를 참조하십시오 . 1970 년 1 월 1 일, 유닉스 시대 이후 많은 단위로 변환되었습니다.
>>> np.datetime64(5, 'ns')
numpy.datetime64('1970-01-01T00:00:00.000000005')
>>> np.datetime64(1508887504, 's')
numpy.datetime64('2017-10-24T23:25:04')
ISO 8601 형식 인 한 문자열을 사용할 수도 있습니다.
>>> np.datetime64('2017-10-24')
numpy.datetime64('2017-10-24')
타임 델타에는 단일 단위가 있습니다
>>> np.timedelta64(5, 'D') # 5 days
>>> np.timedelta64(10, 'h') 10 hours
두 개의 datetime64 객체를 빼서 만들 수도 있습니다
>>> np.datetime64('2017-10-24T05:30:45.67') - np.datetime64('2017-10-22T12:35:40.123')
numpy.timedelta64(147305547,'ms')
팬더 타임 스탬프 및 타임 델타가 NumPy 위에 훨씬 더 많은 기능을 구축
팬더 타임 스탬프는 날짜 시간과 매우 유사하지만 기능이 훨씬 많은 순간입니다. 당신도 그들을 만들 수 있습니다 pd.Timestamp
또는 pd.to_datetime
.
>>> pd.Timestamp(1239.1238934) #defautls to nanoseconds
Timestamp('1970-01-01 00:00:00.000001239')
>>> pd.Timestamp(1239.1238934, unit='D') # change units
Timestamp('1973-05-24 02:58:24.355200')
>>> pd.Timestamp('2017-10-24 05') # partial strings work
Timestamp('2017-10-24 05:00:00')
pd.to_datetime
매우 유사하게 작동하며 (몇 가지 옵션이 더 있음) 문자열 목록을 타임 스탬프로 변환 할 수 있습니다.
>>> pd.to_datetime('2017-10-24 05')
Timestamp('2017-10-24 05:00:00')
>>> pd.to_datetime(['2017-1-1', '2017-1-2'])
DatetimeIndex(['2017-01-01', '2017-01-02'], dtype='datetime64[ns]', freq=None)
Python datetime을 datetime64 및 Timestamp로 변환
>>> dt = datetime.datetime(year=2017, month=10, day=24, hour=4,
minute=3, second=10, microsecond=7199)
>>> np.datetime64(dt)
numpy.datetime64('2017-10-24T04:03:10.007199')
>>> pd.Timestamp(dt) # or pd.to_datetime(dt)
Timestamp('2017-10-24 04:03:10.007199')
numpy datetime64를 datetime 및 Timestamp로 변환
>>> dt64 = np.datetime64('2017-10-24 05:34:20.123456')
>>> unix_epoch = np.datetime64(0, 's')
>>> one_second = np.timedelta64(1, 's')
>>> seconds_since_epoch = (dt64 - unix_epoch) / one_second
>>> seconds_since_epoch
1508823260.123456
>>> datetime.datetime.utcfromtimestamp(seconds_since_epoch)
>>> datetime.datetime(2017, 10, 24, 5, 34, 20, 123456)
타임 스탬프로 변환
>>> pd.Timestamp(dt64)
Timestamp('2017-10-24 05:34:20.123456')
타임 스탬프에서 datetime 및 datetime64로 변환
팬더 타임 스탬프가 매우 강력하기 때문에 이것은 매우 쉽습니다.
>>> ts = pd.Timestamp('2017-10-24 04:24:33.654321')
>>> ts.to_pydatetime() # Python's datetime
datetime.datetime(2017, 10, 24, 4, 24, 33, 654321)
>>> ts.to_datetime64()
numpy.datetime64('2017-10-24T04:24:33.654321000')
답변
>>> dt64.tolist()
datetime.datetime(2012, 5, 1, 0, 0)
의 경우 DatetimeIndex
, 객체 tolist
목록을 반환 datetime
합니다. 단일 datetime64
객체의 경우 단일 객체를 반환 datetime
합니다.
답변
전체 팬더 시리즈 날짜 시간을 일반 파이썬 날짜 시간으로 변환하려면을 사용할 수도 있습니다 .to_pydatetime()
.
pd.date_range('20110101','20110102',freq='H').to_pydatetime()
> [datetime.datetime(2011, 1, 1, 0, 0) datetime.datetime(2011, 1, 1, 1, 0)
datetime.datetime(2011, 1, 1, 2, 0) datetime.datetime(2011, 1, 1, 3, 0)
....
또한 시간대를 지원합니다.
pd.date_range('20110101','20110102',freq='H').tz_localize('UTC').tz_convert('Australia/Sydney').to_pydatetime()
[ datetime.datetime(2011, 1, 1, 11, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
datetime.datetime(2011, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
....
참고 : Pandas Series를 사용 to_pydatetime()
하는 경우 전체 시리즈를 호출 할 수 없습니다 . .to_pydatetime()
목록 이해 또는 이와 유사한 것을 사용하여 각 개별 datetime64 를 호출해야합니다 .
datetimes = [val.to_pydatetime() for val in df.problem_datetime_column]
답변
한 가지 옵션은을 사용 str
하고 다음과 같이 사용하는 것입니다 to_datetime
.
In [11]: str(dt64)
Out[11]: '2012-05-01T01:00:00.000000+0100'
In [12]: pd.to_datetime(str(dt64))
Out[12]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))
참고 : “오프셋 인식”dt
되기 때문에 같지 않습니다 .
In [13]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[13]: datetime.datetime(2012, 5, 1, 1, 0)
이것은 우아하지 않은 것 같습니다.
.
업데이트 : “불쾌한 예”를 다룰 수 있습니다.
In [21]: dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
In [22]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[22]: datetime.datetime(2002, 6, 28, 1, 0)