유닉스 타임 스탬프 문자열을 읽을 수있는 날짜로 변환


825

파이썬에서 유닉스 타임 스탬프 (예 : "1284101485")를 나타내는 문자열이 있으며, 읽을 수있는 날짜로 변환하고 싶습니다. 내가 사용하는 경우 time.strftime, 내가 얻을 TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str

1
다시 변환에 대한 질문 링크 : stackoverflow.com/q/19801727/3273031
slushy

답변:


1209

사용 datetime모듈 :

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

131
.fromtimestamp()현지 시간대에 다른 utc 오프셋이 있으면 지난 날짜에 ​​실패 할 수 있습니다. pytz모듈 (또는 OS)에서 제공 한 역사적인 시간대 데이터베이스가 필요합니다 . 또는 UTC로 작업하고을 사용하십시오 .utcfromtimestamp().
jfs

9
@JFSebastian 당신은 이것이 몇 가지 의견에서 실패 할 수 있다고 언급했습니다-지난 날짜 / 시간 동안 실패 할 이유에 대해 자세히 설명해 주시겠습니까? (공개 투표에 의해 판단하면, 많은 사람들이 당신에 동의하고 이것을 간단하게 볼 수 있습니다) 유닉스 타임 스탬프는 날짜와 시간이 간단합니까?
davidhood2

3
@ davidhood2는 파이썬이 tz 데이터베이스에 액세스 할 수없는 시스템 (Windows)을 사용하고, 현지 시간대를 과거에 다른 UTC 오프셋이있는 시간대로 설정합니다 (예 : 유럽 / 모스크바), 과거의 타임 스탬프가있는 timestamp ()에서 호출하십시오. (2011-). 를 사용하여 계산 된 값과 결과를 비교하십시오 pytz. 불분명 한 경우; 별도의 스택 오버플로 질문을하십시오.
jfs

3
@ davidhood2 : 솔루션 을 보여주는 내 자신의 답변을pytz 게시했습니다 .
jfs

6
가져 오기 지점은 에포크 (epoch) 이후 시간 (초)이 걸립니다. 밀리 초가 있다면 방금 알았 듯이 1000으로 나눠야합니다.
wordsforthewise


145

가장 투표 된 답변은 로컬 시간대를 사용하므로 오류가 발생하기 쉬운 fromtimestamp를 사용하는 것이 좋습니다. 문제를 피하기 위해 더 나은 방법은 UTC를 사용하는 것입니다.

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

posix_time은 변환하려는 Posix epoch 시간입니다.


2
수입 날짜 시간, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk

76
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'

10
time.ctime()time.localtime()로컬 시간대가 다른 UTC 오프셋했다면 과거 날짜에 대해 실패 할 수 있습니다. pytz모듈 (또는 OS)에서 제공 한 역사적인 시간대 데이터베이스가 필요합니다 . 또는 UTC로 작업하고을 사용하십시오 time.gmtime(). datetime더 넓은 날짜 범위를 제공 datetime.utcfromtimestamp()하여 time함수 대신 사용할 수 있습니다 .
jfs

66

두 부분이 있습니다 :

  1. 유닉스 타임 스탬프 ( "epoch 이후의 초")를 현지 시간으로 변환
  2. 현지 시간을 원하는 형식으로 표시하십시오.

과거에 현지 시간대가 다른 utc 오프셋을 가지고 있고 파이썬이 tz 데이터베이스에 액세스 할 수없는 경우에도 작동하는 현지 시간을 얻는 휴대용 방법은 pytz시간대 를 사용하는 것입니다 .

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

이를 표시하기 위해 시스템에서 지원하는 모든 시간 형식을 사용할 수 있습니다. 예 :

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

현지 시간이 필요하지 않은 경우 읽을 수있는 UTC 시간을 대신 가져 오십시오.

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

반환되는 날짜에 영향을 줄 수있는 시간대 문제에 관심 없거나 python이 시스템의 tz 데이터베이스에 액세스 할 수있는 경우 :

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

파이썬 3에서는 stdlib 만 사용하여 시간대 인식 날짜 시간을 얻을 수 있습니다 (파이썬이 시스템의 tz 데이터베이스에 액세스 할 수없는 경우 UTC 오프셋은 잘못 될 수 있습니다 (예 : Windows)).

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

time모듈의 함수 는 해당 C API 주위의 얇은 래퍼이므로 해당 datetime메소드 보다 이식성이 떨어질 수 있습니다. 그렇지 않으면 사용할 수도 있습니다.

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  

현지 시간에 관심이 있다면 가장 투표가 많은 답변이어야합니다.
azzamsa

36

유닉스 타임 스탬프의 사람이 읽을 수있는 타임 스탬프를 위해, 나는 이것을 전에 스크립트에서 사용했습니다 :

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

산출:

'2012 년 12 월 26 일'


25

현재 시간을 이렇게 변환 할 수 있습니다

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

문자열의 날짜를 다른 형식으로 변환합니다.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013

24

시간 / 날짜 / 시간 패키지를 사용하는 것 외에 팬더 를 사용하여 동일한 문제를 해결할 수도 있습니다. 팬더 를 사용 하여 타임 스탬프읽을 수있는 날짜 로 변환 하는 방법은 다음과 같습니다. :

타임 스탬프는 두 가지 형식이 될 수 있습니다.

  1. 13 자리 (밀리 초)- 밀리 초 를 날짜 로 변환하려면 다음을 사용하십시오.

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 자리 (초)- 를 날짜 로 변환하려면 다음을 사용하십시오.

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'

팬더를위한 또 다른 승리-모듈은 모든 것이 환상적입니다
Vaidøtas Ivøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

시간과 함께 타임 스탬프에서 읽을 수있는 날짜를 가져 오십시오. 또한 날짜 형식을 변경할 수도 있습니다.


5
이 답변에 무엇을 추가 않는 답?
kocica

1
현지 시간대 가정 문제와 관련된 경고를 추가하십시오. 프로그래밍의 모범 사례는 타임 스탬프를 로컬 타임 스탬프 대신 UTC 타임스로 저장하는 것입니다. 그러나 현지 시간대가 UTC가 아닌 경우 위의 예제는 잘못된 시간을 반환합니다.
Timothy C. Quinn


6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp

6

gmtime 및 format 함수를 사용하여이를 수행 할 수있는 다른 방법입니다.

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

산출: 2018-10-4 11:57:44


1

방금 성공적으로 사용했습니다.

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date

0

빠르고 더러운 하나의 라이너 :

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'


3
더 간결하게 : '-'. join (map (str, datetime.datetime.now (). timetuple () [: 6]))
Jelle Zijlstra

2
@JelleZijlstra Eh, 나는지도보다 발전기 표현을 선호합니다.
crhodes

4
'2013-5-5-1-9-43'은 어떤 날짜 형식입니까? 나는이 형식을 날짜 / 시간의 유효한 표현으로 보지 못했습니다.
madoki

이것이 유효하지 않은 표현 @madoki로 자격이되는 것에 대해 자세히 설명해 주시겠습니까? 비표준을 의미합니까? 공백과 콜론이 표준 유닉스 디렉토리 문자 세트에 없기 때문에 대부분의 다른 답변보다 파일이나 디렉토리 경로에 포함시킬 수 있다는 장점이 있습니다. 예를 들어 stackoverflow.com/a/458001/209246
eqzx

0

당신은 사용할 수 있습니다 easy_date을 쉽게 그것을 만들 :

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
모든 프로그래밍에는 자체 날짜 및 시간 변환기가 있습니다. 이를 위해 모드 / 프레임 워크를 사용할 필요가 없습니다
JosFabre

strptimestrftime읽을 수없는 경우에도 직관적 인 ... 그리고하지 않습니다 ...하지만 이해하고 의견 존중
라파엘 Amoedo

4
"사용할 필요가 없습니다"는 잘못되었습니다. 내장 라이브러리의 언어와 품질에 따라 다릅니다. Javascript에는 moments.js가 있으며 Java에는 Joda 시간이 있었으며 둘 다 각각의 내장 날짜 및 시간 변환 유틸리티보다 인기가 있습니다 (Joda 시간이 나중에 Java 8의 업데이트 된 표준 라이브러리에 영향을 미쳤습니다). 즉, 질문에 멋진 타사 라이브러리가 필요하지 않으면 표준 라이브러리를 기반으로 답변을하는 것이 좋습니다.
Hejazzman

@NikosVentouras를 수정했습니다. 방금 "IE의 JS 날짜가 다르게 동작합니다"라는 문제가 발생했습니다. 그래서 나는 moment.js를 사용했습니다
JosFabre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.