UNIXタイムスタンプ文字列を読み取り可能な日付に変換する


826

PythonでUNIXタイムスタンプ(「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

回答:


1210

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 2013年

9
@JFSebastianこれはいくつかのコメントで失敗する可能性があるとおっしゃっていましたが、過去の日付/時間で失敗する理由について詳しく教えてください。(賛成投票で判断すると、多くの人があなたに同意し、これを簡単だと考えています)unixタイムスタンプには、単純に同等の日付/時刻がありますか?
davidhood2 2016年

3
@ davidhood2は、Pythonがtzデータベース(Windows)にアクセスできないシステムを使用しローカルタイムゾーンを過去のUTCオフセットが異なるタイムゾーンに設定し(例:ヨーロッパ/モスクワ)、過去のタイムスタンプを使用してfromtimestamp()を呼び出します。 (2011-)。結果を、を使用して計算された値と比較しますpytz。それが不明確な場合; 別のスタックオーバーフローの質問をします。
jfs

3
@ davidhood2:解決策を示す独自の回答をpytz投稿しました。
jfs 2016年

6
インポートポイントは、エポックから秒単位のタイムスタンプがかかることです。ミリ秒の場合は、私が見つけたばかりの1000で除算する必要があります。
wordsthewise


145

最も投票された回答は、ローカルタイムゾーンを使用するためエラーが発生しやすいfromtimestampの使用を提案しています。問題を回避するには、UTCを使用することをお勧めします。

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

posix_timeは、変換するPosixエポック時間です。


2
import datetime、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 2013年

66

2つの部分があります。

  1. UNIXタイムスタンプ(「エポックからの秒数」)を現地時間に変換します
  2. 希望する形式で現地時間を表示します。

ローカルタイムゾーンの過去のutcオフセットが異なり、Pythonが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"))

Python 3では、stdlibのみを使用してタイムゾーン対応の日時を取得できます(Windowsのように、システム上のtzデータベースにPythonがアクセスできない場合、UTCオフセットは間違っている可能性があります)。

#!/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

UNIXタイムスタンプから人間が読み取れるタイムスタンプについては、これを以前にスクリプトで使用しました。

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

time / datetimeパッケージを使用する以外に、パンダを使用して同じ問題を解決することもできます。パンダを使用してタイムスタンプ読み取り可能な日付に変換する方法は次のとおりです

タイムスタンプには、次の2つの形式があります。

  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øtasIvøška

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

タイムスタンプから時刻とともに読み取り可能な日付を取得することもできます。また、日付の形式を変更することもできます。


5
この答えはに何を追加しない、この答えは?
kocica

1
ローカルタイムゾーンの仮定の問題に関連する警告を追加してください。プログラミングのベストプラクティスは、ローカルタイムスタンプではなくUTC時間としてタイムスタンプを格納することです。ただし、上記の例では、ローカルタイムゾーンがUTCでない場合、誤った時刻が返されます。
ティモシーC.クイン

21

Python 3.6以降:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

出力:

2020-01-15 19:51:41

説明:


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ええと、私はマップよりもジェネレーター式を好みます。
2015

4
「2013-5-5-1-9-43」はどのような日付形式ですか?この形式を日付/時刻の有効な表現として見たことはありません。
madoki 2016

これを無効な表現@madokiとみなすものについて詳しく説明できますか?非標準を意味しますか?スペースやコロンは標準のUNIXディレクトリ文字のセットに含まれていないため、他のほとんどの回答よりも優れている主な利点は、ファイルまたはディレクトリパスにそれを含めることができることです。例: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
すべてのプログラミングには、独自の日付と時刻のコンバーターがあります。このためにmods / frameworksを使用する必要はありません
JosFabre

strptimestrftimeそして、直感的ではありません...そして読みにくいです...しかし、私はあなたの意見を理解し、尊重します
Raphael Amoedo

4
「使用する必要がない」というのは間違っています。言語と組み込みライブラリの品質によって異なります。Javascriptにはmoments.jsがあり、Javaにはそれぞれ組み込みの日付と時刻の変換ユーティリティよりも人気のあるJoda時間があります(Joda時間は後にJava 8の更新された標準ライブラリに影響を与えたほどです)。とはいえ、質問が優れたサードパーティライブラリを必要としない限り、標準ライブラリに基づいて回答することが望ましいです。
Hejazzman、2015

私は修正された@NikosVentourasに立っています。「IEでのJS Dateの動作が異なる」という問題が初めて発生しました。それで私はmoment.jsを使いました
JosFabre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.