python—指定日期,从用户登录列表中找出用户该日期最可能的地理位置

题目:指定日期,从用户登录列表中找出用户该日期最可能的地理位置

给定节点列表testlist,包含节点名、节点的出现日期、纬度、经度。指定一个日期nowtime。

如果该日期在节点列表中出现,则直接拷贝到新列表newlist。

如果该日期并未在节点列表中出现,则查找该节点之前出现最近的日期,拷贝该行到新列表。如果之前未出现过,则取该日期之后日期最近的一行拷贝。

最终每个节点都有一行出现在新列表。

这段代码可以估算出在指定时间,节点所处的位置。

#coding: utf-8
import pickle
import time
nowtime = '2009-03-01'
###########################################################################################
# 读取用户每日登陆数据,提取指定日期登陆位置,存入CSV文件。
"""
定义函数
如果等于前一个时间,如果大于前一个时间且小于后一个时间,则返回start_t。
如果没有后一个时间,默认为'2015-12-31'
如果等于后一个时间,则返回后一个时间。其他情况返回none
"""
def getBestTime(l_time,start_t,end_t='2015-12-31'):
    s_time = time.mktime(time.strptime(start_t,'%Y-%m-%d')) # get the seconds for specify date
    e_time = time.mktime(time.strptime(end_t,'%Y-%m-%d'))
    log_time = time.mktime(time.strptime(l_time,'%Y-%m-%d'))
    if (float(log_time) >= float(s_time)) and (float(log_time) < float(e_time)):
        return start_t
#函数定义结束
# 列表日期按从大到小排列(从近到远)
testlist = [
['0', '2015-03-28', 39.759765375, -104.984303125],
['0', '2015-03-27', 39.70999875, -104.95675168749999],
['0', '2015-03-24', 39.72202824, -104.96074968],
['0', '2015-03-23', 39.77230825, -105.0435074375],
['0', '2015-03-01', 39.77455175, -105.01426466666665],
['0', '2015-02-02', 39.76241472, -104.90343176000002],
['1', '2015-03-01', 3.758066, -8],
['1', '2015-01-03', 3.76085332653061, -8],
['2', '2015-03-01', 29.894691000000005, -81.314517],
['2', '2015-03-01', 39.77455175, -105.01426466666665],
['3', '2015-02-03', 39.76241472, -104.90343176000002],
['4', '2015-03-03', 39.76241472, -104.90343176000002],
]
n = len(testlist)
newlist = []
ID = testlist[0][0]		#将ID设为第一个节点
i = 0
j = -1
while i < n:
	"""
	保证每一行都在选定日期列表中出现
	如果第一个日期小于指定日期,则取第一个
	如果刚好能找到相关日期(或者位于两个日期中间的时间),则取相关日期(或前一个)
	如果到该节点登陆日期的最后一行仍不匹配,取最后一行
	"""
	if  i == n-1 and newlist[j][0] != ID:
		newlist.append(testlist[i])
		break
	count = 1 	
	# i+count是当前要处理的结点	
	while i+count < n:	
		# 新列表为空,或者当前ID并未出现在列表,则查找添加
		if j == -1 or newlist[j][0] != ID:	
			# 如果新节点第一个日期符合条件(日期从大到小排列),则添加第一个	
			if  getBestTime(nowtime,testlist[i][1]):
				newlist.append(testlist[i])
				j += 1
				print ID,testlist[i-1][0]
			# 如果当前行和前一行属于同一节点,则取二者日期判断
			elif testlist[i+count][0] == ID and testlist[i+count-1][0] == ID:
				# 如果所求日期介于两者之间(大于等于后一个,小于前一个),则添加后一个更早的日期
				if getBestTime(nowtime,testlist[i+count][1],testlist[i+count-1][1]):
					newlist.append(testlist[i+count])
					j += 1
					count+=1
					break
				count += 1
			# 如果当前行的节点为新节点(同时原ID未添加),说明原ID最后一个日期最接近指定日期,添加该日期并更新ID
			elif testlist[i+count][0] != ID:
				newlist.append(testlist[i+count-1])
				j += 1
				ID = testlist[i+count][0]
				break
		# 当前行的ID已经在新列表中出现,跳出循环从下一个行开始。如果下一个为新节点,顺便则更新ID。
		else:
			if testlist[i+count][0] != ID:
				ID = testlist[i+count][0]
			break
	i = i+count
print newlist


发布了392 篇原创文章 · 获赞 492 · 访问量 241万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览