time
объекты в timedelta
объекты, которые затем могут быть суммированы вместе. (см. строку «печать») from datetime import datetime, timedelta
import pandas as pd
phone = PhoneRecord.objects.all()
df = pd.DataFrame(list([i.__dict__ for i in phone])) # create pd.df from model query
df.et = df.et.fillna('00:00:00') # some records are blank
print(df.et)
print("SUM:", sum([datetime.combine(datetime.min, time) - datetime.min for time in df.et.tolist()], timedelta()))
Вы должны получить что-то вроде этого:
0 00:00:20
1 00:00:20
2 00:00:50
3 00:00:30
4 00:00:20
SUM: 0:02:20
Мне пришлось немного изменить вещи, чтобы заставить их работать на моем конце, так что, надеюсь, То же самое относится и к вам, и к вашей версии Панд и Джанго. Надеюсь, это поможет!
You could set AutoReset to false, then explicitly reset the timer after you are done handling it. Of course, how you handle it really depends on how you expect the timer to operate. Doing it this way would allow your timer to drift away from the actual specified interval (as would stopping and restarting). Your mechanism would allow each interval to fire and be handled but it may result in a backlog of unhandled events that are handled now where near the expiration of the timer that cause the handler to be invoked.
timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds;
timer.Elapsed += Timer_OnElapsed;
timer.AutoReset = false;
timer.Start();
public void Timer_OnElapsed(object sender, ElapsedEventArgs e)
{
if (!found)
{
found = LookForItWhichMightTakeALongTime();
}
timer.Start();
}
Если LookForItWhichMightTakeALongTime ()
займет много времени, я бы предложил не использовать System.Windows.Forms.Timer
, потому что при этом заблокирует ваш поток пользовательского интерфейса, и пользователь может убить ваше приложение, думая, что оно заморожено.
Вы можете использовать BackgroundWorker
(вместе с таймером
, если это необходимо) .
public class MyForm : Form
{
private BackgroundWorker backgroundWorker = new BackgroundWorker();
public MyForm()
{
InitializeComponents();
backgroundWorker.DoWork += backgroundWorker_DoWork;
backgroundWorker.RunWorkerCompleted +=
backgroundWorker_RunWorkerCompleted;
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = LookForItWhichMightTakeALongTime();
}
private void backgroundWorker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
found = e.Result as MyClass;
}
}
И вы можете вызывать RunWorkerAsync ()
из любого места, где вы хотите, даже из Timer
, если хотите. И просто убедитесь, что BackgroundWorker
уже запущен с момента вызова RunWorkerAsync ()
, когда он работает, выдаст исключение.
private void timer_Tick(object sender, EventArgs e)
{
if (!backgroundWorker.IsBusy)
backgroundWorker.RunWorkerAsync();
}
timer.enabled = false
или
timer.stop();
и
timer.enabled = true
или
timer.start();
Я обычно останавливаю таймер во время его обработки, вводю блок try / finally и возобновляю таймер после завершения.
Я использую System.Threading.Timer примерно так
class Class1
{
static Timer timer = new Timer(DoSomething,null,TimeSpan.FromMinutes(1),TimeSpan.FromMinutes(1));
private static void DoSomething(object state)
{
timer = null; // stop timer
// do some long stuff here
timer = new Timer(DoSomething, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
}
}