MySQL imp的Python解析

2024-10-05 12:19:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的第一个python项目是一个转换器,用于MySQL导入时获取形状数据。 我已经用target.writelines(data[start:stop])删除了文件中所有不需要的行。在

现在我有大约2000行这样的台词:

12011,54,0,.375,-.183,2.325,1.221,0.016,0,0431.4,.345,1.563,25.13,13.23

而54代表儒略日。在

对于导入到包含3行(datetime、value id、value)的表,应该将其转换为:

2011-23-02 00:00:00,1,-0.183
2011-23-02 00:00:00,2,2.325
2011-23-02 00:00:00,3,1.221
2011-23-02 00:00:00,4,0
2011-23-02 00:00:00,5,0.016
2011-23-02 00:00:00,6,0
2011-23-02 00:00:00,7,0
2011-23-02 00:00:00,8431.4
2011-23-02 00:00:00,9,0.345
2011-23-02 00:00:00,10,1.563

请注意,第一个、第五个和最后两个值已被删除。第一个和第五个出现在每一行中,最后两个只在0点和12点出现。在

我读过julian的转换可以用datetime模块(Convert julian day into date)存档。在

您建议使用哪些Python工具来高效地完成任务?在

更新

谢谢你CoDEmanX,我实现了你建议的代码与一些替代,并几乎完成。剩下2个问题:

  1. 是否有一种内置的方式来正确处理闰年(例如,儒略60应该是闰年的2月29日,其他年份应该是3月1日)?

  2. 我试图实现时间(小时,分钟)。由于时间变量的长度不同(1-4个字符),我当前的实现只能在1000到2355之间工作。我可以轮询时间长度,并为每种情况制作日期格式命令。我想有一个更简单的解决办法。在

    lines = f_open.readlines()
    # split string and ignore unwanted elements
    for line in lines:
        _, year, julian, time, value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, *_ = line.split(",")
    # format date, convert julian day-of-year to 'day-month'
        date = "%s-%s %s:%s:00" % (int(year), datetime.strptime(julian, "%j").strftime("%m-%d"), time[:2], time[2:])
        with open(targetName, 'a') as target:
            target.write(",".join((date, "1", value1+"\n")))
            target.write(",".join((date, "2", value2+"\n")))
            target.write(",".join((date, "3", value3+"\n")))
            target.write(",".join((date, "4", value4+"\n")))
            target.write(",".join((date, "5", value5+"\n")))
            target.write(",".join((date, "6", value6+"\n")))
            target.write(",".join((date, "7", value7+"\n")))
            target.write(",".join((date, "8", value8+"\n")))
            target.write(",".join((date, "9", value9+"\n")))
            target.write(",".join((date, "10", value10+"\n")))
    

Tags: targetdatetimedatetimevalue时间openyear
1条回答
网友
1楼 · 发布于 2024-10-05 12:19:10

内置的python模块应该足够了。避免使用premature optimization,只在简单的解决方案太慢时寻找提高速度和效率的方法。在

from datetime import datetime

line = "1,2011,54,0,.375,-.183,2.325,1.221,0,.016,0,0,431.4,.345,1.563,25.13,13.23"

# split string and ignore 4th and every thing from the 6th element on
id, year, julian, _, value, *_ = line.split(",")

# format date, convert julian day-of-year to 'day-month'
date = "%s-%s 00:00:00" % (int(year), datetime.strptime(julian, "%j").strftime("%d-%m"))

print(",".join((date, id, value)))
#>>> 2011-23-02 00:00:00,1,.375

# could cast to numeric types if needed
#id = int(id)
#value = float(value)

真正的朱利安日期中的闰年是不容易处理的,尤其是在维基关于Julian calendar的文章中——它甚至不一致(例如在公元前45年左右改为日历系统)。在

datetime模块确实将闰年纳入会计核算,但是,如果您提供了年份和日期:

^{pr2}$

因此,您可以计算日期,如下所示:

date = datetime.strptime(year+julian, "%Y%j").strftime("%Y-%d-%m")

再加上将值拆分为多行:

^{4}$

相关问题 更多 >

    热门问题