datetime.datetime.fromtimestamp()está correto, exceto que você provavelmente está tendo o registro de data e hora em milissegundos (como no JavaScript), mas fromtimestamp()espera o registro de data e hora do Unix, em segundos.
Faça assim:
>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)
e o resultado é:
>>> date
datetime.datetime(2012, 3, 16, 1, 0)
Responde a sua pergunta?
EDIT : JF Sebastian sugeriu corretamente o uso de divisão verdadeira por 1e3(float 1000). A diferença é significativa, se você deseja obter resultados precisos, mudei minha resposta. A diferença resulta do comportamento padrão do Python 2.x, que sempre retorna intao dividir (usando o /operador) intpor int(isso é chamado de divisão de piso ). Substituindo o divisor 1000(sendo um int) pelo 1e3divisor (sendo representação de 1000como flutuador) ou por float(1000)(ou 1000.etc.), a divisão se torna verdadeira divisão . O Python 2.x retorna floatao dividir intpor float, floatpor int,floatpor floatetc. E quando houver uma parte fracionária no carimbo de data / hora passada para o fromtimestamp()método, o resultado desse método também conterá informações sobre essa parte fracionária (como o número de microssegundos).
/ 1e3