我有一个时间戳的数据帧。我正在尝试使用.loc更新此数据帧的一个片段。当我将datetime单独添加到切片时,返回的结果与预期的一样
但是,当我尝试将其分配给数据帧以便其就地更新时,格式将作为UNIX时间戳返回(即1591003030000000000)。我想知道如何解决这个问题,以便dataframe显示所有datetime对象
import numpy as np
import pandas as pd
import datetime
import itertools
num_trucks=8
year,month,day=datetime.datetime.now().year,datetime.datetime.now().month,datetime.datetime.now().day
digging_time=210
loaded_travel=600
dumping_time=90
unloaded_travel=500
full_cycle = digging_time+loaded_travel+dumping_time+unloaded_travel
crib_loc=0.4
dump_to_crib=int((1-crib_loc)*unloaded_travel)
dig_to_crib=int(0.4*unloaded_travel)
trucks=['Truck'+str(i) for i in range(1,num_trucks+1)]
df=pd.DataFrame(columns=['truck','queue_dig','start_dig','stop_dig','start_dump','stop_dump','pass_crib'],index=range(0,int(43200/full_cycle)*num_trucks))
def fill_cycle(df):
while len(df.dropna()) < num_trucks:
if len(df.dropna()) == 0:
start = pd.Timestamp(year,month,day,6,30)
df.at[0,'truck']='Truck1'
df.at[0,'queue_dig']=start
df.at[0,'start_dig']=start
df.at[0,'stop_dig']=df.at[0,'start_dig']+pd.Timedelta(seconds=digging_time)
df.at[0,'start_dump']=df.at[0,'stop_dig']+pd.Timedelta(seconds=loaded_travel)
df.at[0,'stop_dump']=df.at[0,'start_dump']+pd.Timedelta(seconds=dumping_time)
df.at[0,'pass_crib']=df.at[0,'stop_dump']+pd.Timedelta(seconds=dump_to_crib)
else:
#last row entered
lr=df.dropna(how='all').index[-1]
#next truck to go
next_truck=[truck for truck in trucks if truck not in df.dropna(how='all')['truck'].values][0]
df.at[lr+1,'truck']=next_truck
df.at[lr+1,'queue_dig']=start
df.at[lr+1,'start_dig']=df.at[lr,'stop_dig']
df.at[lr+1,'stop_dig']=df.at[lr+1,'start_dig']+pd.Timedelta(seconds=digging_time)
df.at[lr+1,'start_dump']=df.at[lr+1,'stop_dig']+pd.Timedelta(seconds=loaded_travel)
df.at[lr+1,'stop_dump']=df.at[lr+1,'start_dump']+pd.Timedelta(seconds=dumping_time)
df.at[lr+1,'pass_crib']=df.at[lr+1,'start_dump']+pd.Timedelta(seconds=dump_to_crib)
for truck in itertools.cycle(trucks):
this_truck=max(df[df['truck']==truck]['stop_dump'])
lr=df.dropna(how='all').index[-1]
if df.at[lr,'stop_dig'] > pd.Timestamp(year,month,day,18,00,00) - pd.Timedelta(seconds=full_cycle):
break
df.at[lr+1,'truck']=truck
last_truck=df.at[lr,'stop_dig']
df.at[lr+1,'queue_dig']=this_truck + pd.Timedelta(seconds=unloaded_travel)
if df.at[lr+1,'queue_dig'] < last_truck:
df.at[lr+1,'start_dig']=df.at[lr,'stop_dig']
else:
df.at[lr+1,'start_dig']=df.at[lr+1,'queue_dig']
df.at[lr+1,'stop_dig']=df.at[lr+1,'start_dig']+pd.Timedelta(seconds=digging_time)
df.at[lr+1,'start_dump']=df.at[lr+1,'stop_dig']+pd.Timedelta(seconds=loaded_travel)
df.at[lr+1,'stop_dump']=df.at[lr+1,'start_dump']+pd.Timedelta(seconds=dumping_time)
df.at[lr+1,'pass_crib']=df.at[lr+1,'start_dump']+pd.Timedelta(seconds=dump_to_crib)
df.dropna(inplace=True)
fill_cycle(df)
#this is the important part
df.loc[(df.index>100)&(df['truck']=='Truck4'),df.columns.drop('truck')]=df.loc[(df.index>100)&(df['truck']=='Truck4'),df.columns.drop('truck')]+pd.Timedelta(seconds=500)
df.loc[(df.index>100)&(df['truck']=='Truck4'),df.columns.drop('truck')]
目前没有回答
相关问题 更多 >
编程相关推荐