我的来源是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
的输入,因此我认为它应该是int
或float
。非常感谢。
PS - 我检查了类似的问题,但趋势是使用.date()
方法或熊猫的pd.to_datetime
及其变体,或产生各种对象的方法。适合scikit model
或matplotlib
。
修改
我应该更清楚:我想绘制real dates
(所以没有toordinal
),因此不能使用datetime选项(不适用于pyplot
和{{ 1}},当试图将scikit
变为datetime
时;因此,我可能需要找到一种方法来将2000/01/17或2000.01.17之类的东西视为整数。
答案 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
将其包裹在试块中以确保安全。
答案 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}}