2

我有一个包含多个条目的 CSV 文件,每个条目都有 2 个 unix 时间戳格式的日期。

我有一个名为 的方法convert(),它接收时间戳并将其转换为YYYYMMDD.

现在,由于我在每一行中有 2 个时间戳,我将如何用新值替换每个时间戳?

编辑:为了澄清,我想将每个出现的时间戳转换为YYYYMMDD格式。这就是困扰我的地方,因为它re.findall()返回了一个列表。

4

4 回答 4

3

如果你知道替换:

p = re.compile( r',\d{8},')
p.sub( ','+someval+',', csvstring )

如果是格式更改:

p = re.compile( r',(\d{4})(\d\d)(\d\d),')
p.sub( r',\3-\2-\1,', csvstring )

编辑:对不起,刚刚意识到你说python,上面修改过

于 2009-05-26T02:53:37.660 回答
1

我假设“unix时间戳格式化日期”是指自纪元以来的秒数。这假定文件中的每个数字都是 UNIX 时间戳。如果不是这种情况,您需要调整正则表达式:

import re, sys

# your convert function goes here

regex = re.compile(r'(\d+)')
for line in sys.stdin:
  sys.stdout.write(regex.sub(lambda m:
  convert(int(m.group(1))), line))

这从标准输入读取并在找到的每个数字上调用转换。

这里的“技巧”是re.sub可以采用一个将匹配对象转换为字符串的函数。我假设您的转换函数需要一个 int 并返回一个字符串,所以我使用 lambda 作为适配器函数来获取匹配的第一组,将其转换为 int,然后将生成的 int 传递给转换。

于 2009-05-26T03:20:59.307 回答
1

无法评论您的问题,但您是否看过 python 的 CSV 模块? http://docs.python.org/library/csv.html#module-csv

于 2009-05-26T06:55:48.433 回答
0

我会使用这些方面的东西。很像 Laurence 的响应,但具有您请求的时间戳转换并将文件名作为参数。此代码假定您正在使用最近的日期(2001 年 9 月 9 日之后)。如果您需要更早的日期,请降低 10 到 9 或更少。

import re, sys, time

regex = re.compile(r'(\d{10,})')

def convert(unixtime):
  return time.strftime("%Y%m%d", time.gmtime(unixtime))

for line in open(sys.argv[1]):
  sys.stdout.write(regex.sub(lambda m: convert(int(m.group(0))), line))

编辑:清理代码。

样本输入

foo,1234567890,bar,1243310263
cat,1243310263,pants,1234567890
baz,987654321,raz,1

输出

foo,20090213,bar,20090526
cat,20090526,pants,20090213
baz,987654321,raz,1 # not converted (too short to be a recent)
于 2009-05-26T03:55:32.217 回答