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


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

strptime및 strftime읽을 수없는 경우에도 직관적 인 ... 그리고하지 않습니다 ...하지만 이해하고 의견 존중
— 라파엘 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.