2012-05-15 2 views
2

У меня проблема, когда я много работаю с разницей времени и времени. До сих пор я решил это, используя множество операторов if, но они подвержены ошибкам. В поисках лучшего решения и не изобретая колесо, я натолкнулся на время, дату и timedelta. Но они кажутся слишком негибкими для меня, поэтому я ищу идеи и советы о том, как решить эту проблему, используя встроенные функции python - если это возможно. Вот проблема: объединение спутниковых данных с валов в регулярную сетку включает в себя множество простых вычислений времени. Если у меня есть целое число date: 200702100700 Я хочу добавить и вычесть часы и минуты из такого формата времени, чтобы дата - 18 дала мне новую дату, которая учитывает високосный год и может пересекать, год, месяц, день назад и вперед. Вот что я понимаю пакет даты и времени питона:Работа со временем, датой, timedelta

from datetime import timedelta, date, time 
t1 = date(2007,01,01); t = time(12,0); t2 = datetime.combine(t1,t) 
t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3 
print t4 
>>>datetime.timedelta(2006, 23401, 3001) 

На этот раз не очень полезный в скрипте, который будет делать тысячи расчетов. Моя проблема в том, что у t4 нет объектов года, месяца или дня, а в 2006 году, как представляется, рассматриваются как часы. Все это очень запутанно. Возможно ли это в python/numpy/scipy? Если да, может кто-нибудь дать мне подсказку?

ответ

4

Gerrat получил это право, использовать объект DateTime.

Вы можете создать объект datetime полностью, не создавая дату и время отдельно (или используя datetime.strptime()).

BUG ALERT Ваш код и некоторые из полученных ответов будут вводить труднодоступную ошибку.

// this works 
datetime(2007,01,01,12) 
// this breaks 
datetime(2007,01,09,12) 

В питона, набрав «0» в «09» делает это восьмеричное число («09» не действует) при использовании дат в в коде, избежать ведущего нуля.

+1

Nice catch Phil. Я бы никогда не превзошел любые цифры с помощью «0» в моем собственном коде, но на самом деле не думал о разветвлениях здесь. – Gerrat

+1

Отличный пункт! Я обязательно сделаю это. Часто основной причиной такого заполнения является поиск строки файла или создание такой строки. Мои файлы такие. – Shejo284

2

То, что вы хотите использовать это DateTime объект, а не дата объекта:

from datetime import datetime, timedelta 
t1 = datetime(2007, 01, 01) 
print t1 - timedelta(days=18) 
>>>datetime.datetime(2006, 12, 14, 0, 0) 
print t1 - timedelta(hours=18) 
>>>datetime.datetime(2006, 12, 31, 6, 0) 

Это будет работать с часами, минуты и секунды, как хорошо!

+0

Спасибо, это будет работать красиво! – Shejo284

3
from datetime import datetime, timedelta, date, time 
t2 = datetime(2007, 1, 1, 12, 0, 0); 
t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3 
print "YEAR", t4.year 
print "MONTH", t4.month 
print "DAY", t4.day 
print "HOUR", t4.hour 
print "MINUTE", t4.minute 

Бег что ...

[Mike_Pennington ~]$ python foo.py 
YEAR 2006 
MONTH 12 
DAY 31 
HOUR 18 
MINUTE 0 
[Mike_Pennington ~]$ 
+0

Спасибо, это будет хорошо! – Shejo284

Смежные вопросы