从txt文件解析日期为整数

时间:2017-09-08 17:38:20

标签: python parsing matplotlib scikit-learn data-science

我的来源是txt文件,其格式为:

cpu95-20000117-04004,134.perl,42.6,44.4
cpu95-20000117-04004,147.vortex,44.7,44.7

我想用python将日期解析为可以用matplotlib.pyplot绘制的形式(即没有字符串或Timestamp对象)。 我将根据日期(即2000/01/17)绘制最后一项(即44.4)。 我之后也将此数据用作scikitlearn linear regression model的输入,因此我认为它应该是intfloat。非常感谢。

PS - 我检查了类似的问题,但趋势是使用.date()方法或熊猫的pd.to_datetime及其变体,或产生各种对象的方法。适合scikit modelmatplotlib

修改 我应该更清楚:我想绘制real dates(所以没有toordinal),因此不能使用datetime选项(不适用于pyplot和{{ 1}},当试图将scikit变为datetime时;因此,我可能需要找到一种方法来将2000/01/17或2000.01.17之类的东西视为整数。

5 个答案:

答案 0 :(得分:1)

假设你可以使用年份的整数表示和行中最后一项的浮点值作为scikit的输入,这应该做你想要的。

toordinal会为日期返回一个名为'proleptic'的内容。这意味着1年1月1日由1表示,1月2日变为2,等等。这对于普通回归是正常的。

re.search从输入行中取出您需要的两个部分以进行进一步处理。

编译三个列表作为for循环进程。 Y最终包含输入行中的最终项目,dates_for_plotting matplotlib需要的日期和dates_for_regression回归所需的整数值。

脚本的最后一部分显示了如何使用从输入中收集的日期来创建绘图。

>>> txt = '''\
... cpu95-20000117-04004,134.perl,42.6,44.4
... cpu95-20000117-04004,147.vortex,44.7,44.7
... '''
>>> import re
>>> from datetime import datetime
>>> Y = []
>>> dates_for_plotting = []
>>> dates_for_regression = []
>>> for line in txt.split('\n'):
...     if line:
...         r = re.search(r'-([^-]+)-(?:[^,]+,){3}([0-9.]+)', line).groups()
...         the_date = datetime.strptime(r[0], '%Y%m%d')
...         dates_for_plotting.append(the_date.date())
...         dates_for_regression.append(the_date.toordinal())
...         Y.append(r[1])
...         
>>> import matplotlib.pyplot as plt
>>> import matplotlib.dates as mdates
>>> plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
>>> plt.gca().xaxis.set_major_locator(mdates.DayLocator())
>>> plt.plot(dates_for_plotting, Y)
>>> plt.gcf().autofmt_xdate()
>>> plt.show()

答案 1 :(得分:0)

为此你可能需要编写自己的小解析器。

您可以使用正则表达式,也可以在文件的每一行使用line.split(',')。

答案 2 :(得分:0)

将数字包装在int()中。

示例:

myString = "20000117"
try:
    myVar = int(myString)
except ValueError:
    pass # or take some action here

Python parse int from string

将其包裹在试块中以确保安全。

答案 3 :(得分:0)

如果我理解你的问题,也许这就是你要找的东西:)

with open("YourFileName.txt",'r') as f:
    for line in f.readlines():
        line = line.strip()
        #line = "cpu95-20000117-04004,134.perl,42.6,44.4"
        items = line.split(',') # [cpu95-20000117-04004,134.perl,42.6,44.4]

        date = int(items[0].split('-')[1])
        lastItem = float(items[-1])
        # rest of your code

答案 4 :(得分:0)

不是最佳答案,但您可以尝试这样

{{1}}