【问题标题】:Slicing files in python with conditons使用条件在python中切片文件
【发布时间】:2018-02-14 06:41:27
【问题描述】:
假设我有一个 txt。文件看起来像这样:
0 day0 event_data0
1 day1 event_data1
2 day2 event_data2
3 day3 event_data3
4 day4 event_data4
........
n dayn event_datan
#where:
#n is the event index
#dayn is the day when the event happened. year-month-day format
#event_datan is what happened at the event.
从这个文件中,我需要创建一个包含两个特定日期之间发生的所有事件的新文件。比如 2003 年 9 月 7 日之后和 2006 年圣诞节之前。
有人可以帮我解决这个问题吗?非常感谢!
【问题讨论】:
标签:
python-3.x
file
slice
【解决方案1】:
您没有描述您特别想要“2003 年 9 月 7 日之后和 2006 年圣诞节之前”。或者您对这两个日期还有其他选择吗?
如果专门用于“2003 年 9 月 7 日之后和 2006 年圣诞节之前”。那么我认为您可以使用正则表达式模块获得结果:
import re
c=r"([0-9]{1,2}\s+)(2003-09-07).+(2006-12-25)\s+\w+"
with open("event.txt","r") as f:
file_data=f.readlines()
regex_search=re.search(c,str(file_data))
print(regex_search.group())
你也可以使用 group() 的条件,或者你可以使用 findall() 方法。
【解决方案2】:
我假设您的文件是制表符分隔的,因此您可以使用 pandas 包来阅读它。只需在 .txt 文件中添加列名(索引、日期、事件)的第一行,以制表符分隔,然后读入数据。
df = pandas.read_csv('txt_file.txt', sep='\t', index_col=0)
#index_col=0 just sets your first column as index
完成此操作后,请按照此link 中的步骤操作。这将基本上回答你关于如何通过简单地使用这个包来选择两个日期之间的事件的问题。这样你就可以只返回一个包含你需要的事件的新数据框。
【解决方案3】:
卢卡斯,你可以试试这个:
import re
import os
from datetime import datetime as dt
__date_start__ = dt.strptime('2003-09-07', "%Y-%m-%d").date()
__date_end__ = dt.strptime('2006-12-25', "%Y-%m-%d").date()
f = open('file.txt', 'r').read()
os.remove('events.txt')
for i in f:
date = re.search('\d{4}\-\d{2}-\d{2}',i).group(0)
if date != '':
date_converted = dt.strptime(date, '%Y-%m-%d').date()
if (date_converted > __date_start__) and (date_converted < __date_end__):
open('events.txt', 'a').write(i)
您将__date_start__ 和__date_end__ 值更改为您想要的间隔,然后,代码将在行中搜索与日期格式yyyy-mm-dd 匹配的正则表达式。依此类推,它将在范围内进行比较(日期开始和结束),如果为真,则将行内容附加到 events.txt 文件中。
【解决方案4】:
看起来datetime 模块就是您想要的。逐行遍历文件,直到当前行的日期和您的开始阈值日期(在您的示例中为 2003 年 9 月 7 日)之间的时间增量为正;当您违反 2006 年圣诞节时停止迭代。将这些行加载到 pandas 数据框或 numpy 数组中。