将 txt 文件中的日期解析为整数

Posted

技术标签:

【中文标题】将 txt 文件中的日期解析为整数【英文标题】:Parsing dates from txt file as integers 【发布时间】:2018-02-17 16:47:17 【问题描述】:

我的来源是txt文件,格式如下:

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

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

PS - 我检查了类似的问题,但趋势是使用.date() 方法或panda 的pd.to_datetime 及其变体,或者生成不适合scikit modelmatplotlib 的对象的方法.

编辑 我应该更清楚:我想绘制real dates(所以没有toordinal),因此不能使用日期时间选项(不适用于pyplotscikit,当试图转动@987654335时@到int);因此,我可能需要找到一种方法将 2000/01/17 或 2000.01.17 之类的东西视为整数。

【问题讨论】:

你查过here吗?你为什么要给一个模特配上这样的日期?通常的做法是使用索引。假设2000:01:17 是等于1 的初始周期点。那么,下一个周期将等于2,依此类推。您无法将2000/01/172000.01.17 视为int 对象。 【参考方案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()

【讨论】:

【参考方案2】:

不是最好的答案,但你可以这样尝试

import csv
from datetime import datetime
with open('file.txt', 'r') as file:
    dt = csv.reader(file, delimiter=',')
    for row in dt:
        date = int(row[0][6:14])
        value = float(row[3])

【讨论】:

【参考方案3】:

如果我正确理解了您的问题,也许这就是您要寻找的东西:)

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】:

将数字包装在 int() 中。

例子:

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

Python parse int from string

将其包装在 try 块中以确保安全。

【讨论】:

【参考方案5】:

为此,您可能必须编写自己的小型解析器。

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

【讨论】:

以上是关于将 txt 文件中的日期解析为整数的主要内容,如果未能解决你的问题,请参考以下文章

我无法将 csv 文件中的日期信息解析为 ipython

从 json 文件中解析 grails 中的日期

将时间戳数据解析为本地日期和时间的问题

如何在数据工作室的 bigquery 中将年份整数解析为日期?

将 xlsb 文件读取为 pandas 数据框并将日期列解析为日期时间格式

Excel 和 OpenOffice 中的日期格式不同