datetime.datetime.fromtimestamp() es correcto, excepto que probablemente tenga una marca de tiempo en milisegundos (como en JavaScript), pero fromtimestamp() espera la marca de tiempo de Unix, en segundos.
Hazlo así:
>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)
y el resultado es:
>>> date
datetime.datetime(2012, 3, 16, 1, 0)
¿Responde tu pregunta?
EDITAR : JF Sebastian sugirió correctamente usar la verdadera división por 1e3(flotante 1000). La diferencia es significativa, si desea obtener resultados precisos, por lo tanto, cambié mi respuesta. La diferencia resulta del comportamiento predeterminado de Python 2.x, que siempre regresa intal dividir (usando el /operador) intpor int(esto se llama división de piso ). Al reemplazar el divisor 1000(siendo un int) con el 1e3divisor (siendo la representación de 1000como flotante) o con float(1000)(o 1000.etc.), la división se convierte en verdadera división . Python 2.x regresa floatcuando se divide intpor float,float por int,floatpor floatetc. Y cuando hay una parte fraccional en la marca de tiempo pasada al fromtimestamp()método, el resultado de este método también contiene información sobre esa parte fraccionaria (como el número de microsegundos).
/ 1e3