Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按天分割数据_Python_Datetime_Time - Fatal编程技术网

Python 按天分割数据

Python 按天分割数据,python,datetime,time,Python,Datetime,Time,我有时间纪元(UNIX时间)的数据文件,我正在尝试将数据按天/日期拆分为单独的文件。这些数据是90天的,所以应该分为90个文件。我不知道如何开始。有时我知道天数,有时我不知道,所以为了方便起见,我正试图找到一种更好的方法来简单地按天/日期分割数据数据[0]数据[1]时间纪元[2]时间纪元[3]时间_1和时间_2是开始时间和停止时间 数据:这只是几行 Data_1 Data_2 Time_1 Time_2 3436 1174 1756908 1759291 3436 303

我有时间纪元(UNIX时间)的数据文件,我正在尝试将数据按天/日期拆分为单独的文件。这些数据是90天的,所以应该分为90个文件。我不知道如何开始。有时我知道天数,有时我不知道,所以为了方便起见,我正试图找到一种更好的方法来简单地按天/日期分割数据<代码>数据[0]数据[1]时间纪元[2]时间纪元[3]<代码>时间_1和时间_2是开始时间和停止时间

数据:这只是几行

Data_1  Data_2  Time_1  Time_2
3436    1174    1756908 1759291
3436    3031    1756908 1759291
3436    1349    1756908 1759291
5372    937     1756913 1756983
4821    937     1756913 1756983
4376    937     1756913 1756983
2684    937     1756913 1756983
3826    896     1756961 1756971
3826    896     1756980 1756997
5372    937     1756983 1757045
4821    937     1756983 1757045
4376    937     1756983 1757045
2684    937     1756983 1757045
3826    896     1757003 1757053
4944    3715    1757009 1757491
4944    4391    1757009 1757491
2539    1431    1757014 1757337
5372    937     1757045 1757104
4821    937     1757045 1757104
4376    937     1757045 1757104
2684    937     1757045 1757104
896     606     1757053 1757064
3826    896     1757064 1757074
5045    4901    1757074 1757085
4921    4901    1757074 1757085
4901    3545    1757074 1757085
4901    3140    1757074 1757085
4901    4243    1757074 1757085
896     606     1757074 1757084

datetime.fromtimestamp(时间戳)

可以从时间戳和


datetime.fromtimestamp(timestamp).replace(秒=0,分钟=0,小时=0)


可以获得一个只包含日期组件的datetime对象。

要从POSIX时间戳中查找UTC日期,只需将其添加到历元中即可,例如:

>>> from datetime import date, timedelta
>>> date(1970, 1, 1) + timedelta(seconds=1756908)
datetime.date(1970, 1, 21)
然后创建映射:
date->file
,并使用它分割输入文件:

#!/usr/bin/env python
import fileinput
from datetime import date, timedelta

def get_date(line, epoch=date(1970, 1, 1)):
    try:
        timestamp = int(line.split()[2]) # timestamp from 3rd column
        return epoch + timedelta(seconds=timestamp) # UTC date
    except Exception:
        return None # can't parse timestamp

daily_files = {} # date -> file
input_file = fileinput.input()
next(input_file) # skip header
for line in input_file:
    d = get_date(line)
    file = daily_files.get(d)
    if file is None: # file for the given date is not found
       file = daily_files[d] = open(str(d), 'w') # open a new one
    file.write(line)

# close all files
for f in daily_files.values():
    try:
        f.close()
    except EnvironmentError:
        pass # ignore errors

下一个代码将把每一行写入名为output yyy-MM-DD的文件,其中yyy-MM-DD是从Time_2列提取的


这段代码不是很有效。它为每一行打开一个文件。如果您能确保输入数据按结束时间排序,则可能会有所改进。

可能会有所帮助。不过,这些时间戳有些奇怪。是的,它们有点奇怪。这是什么意思:“两个时间戳都要考虑”?你想要时间戳之间的中间日期吗?提供几个示例,说明如何从两个时间戳中获得一天。@J.F.Sebastian No。。这是做什么是完美的。我现在正准备更改更新块。我有一个时间纪元的第二步,所以我在这方面面临一些困难,但现在我改变了步骤的顺序,这对我来说很有效。。谢谢。你确定当地的日期是明确的(单调的)吗?它适用于普通时区。这对他们所有人都是真的吗?这就是为什么我在中使用UTC日期,因为它是唯一的(永远不会重复)。另一个问题:
groupby()
如果数据未排序,则失败。由于各种原因,输入数据中的时间戳通常不是单调的。这就是为什么我在我的答案中使用
daily_files
dictionary(90个条目)(无论顺序如何都有效)。@J.F.Sebastian这个解决方案是如此优雅和高效,以至于我无法编写它。是的,你的警告适用。我们的答案也可能以某种方式组合在一起。不幸的是,如果f中的
未按
键排序,则可能会丢失数据。你可以从我的答案中选取必要的部分来修复它。nano-nitpick:。为了支持大文件,您可以逐行编写(尽管我认为在这种情况下没有必要更改代码),这是我看到的最简单的方法。再次感谢,并将考虑@ J.F.SebBasTee讨论UTC日期。这看起来很棒。谢谢请检查更新。
import itertools
import datetime

# Extract the date from the timestamp that is the third item in a line
# (Will be grouping by start timestamp)
def key(s):
    return datetime.date.fromtimestamp(int(s.split()[2]))

with open('in.txt') as in_f:
    for date, group in itertools.groupby(in_f, key=key):
        # Output to file that is named like "1970-01-01.txt"
        with open('{:%Y-%m-%d}.txt'.format(date), 'w') as out_f:
            out_f.writelines(group)
from datetime import date
with open('infile.txt', 'r') as f:
    for line in f: 
        fields = line.split()
        with open('output-'+date.fromtimestamp(float(fields[3])).__str__(), 'a') as outf:
            outf.write(line)