在bash

时间:2018-01-07 22:52:40

标签: bash

我有时间记录时间戳(epoch unix time)格式:

1515365117236

1515365123162

1515365139963

我想将其转换为像

这样的常规日期
2017-01-07 23:48:01

2017-01-07 23:48:02

2017-01-07 23:48:03

任何想法哪种方法最快?

cat ff1.csv | while read line ; do echo $line\;$(date -d +"%Y-%m-%d %H:%M:%S") ; done > somefile.csv

这需要花费大量时间,只需追加当前时间

3 个答案:

答案 0 :(得分:2)

使用printf的{​​{1}}:

,另一种方法必须快得多
bash version >4.2

对于$ printf '%(datefmt)T\n' epoch ,您需要datefmt接受的字符串 - 请参阅strftime(3)

测试:

man 3 strftime

在这种情况下,$ cat file10 1515365117236 1515365123162 1515365139963 $ printf '%(%F %H:%M:%S)T\n' $(cat file10) 49990-01-04 04:47:16 49990-01-04 06:26:02 49990-01-04 11:06:03 格式字符串为:

  

%F相当于%Y-%m-%d(ISO 8601日期格式)。 (C99)

     

%H使用24小时制作为十进制数的小时(范围00至23)。(从tm_hour计算。)

     

%M作为十进制数的分钟(范围00至59)。 (从tm_min计算。)

     

%S第二个作为十进制数(范围00到60)。 (范围最高为60,允许偶尔的闰秒.-从tm_sec计算。)

更新以删除毫秒:

printf

答案 1 :(得分:1)

将纪元转换为日期的方法是pd.MultiIndex

另一种方法是使用idx = pd.MultiIndex.from_product( [df.Team.unique(), df.LeadWeek.unique(), np.arange(5)] ) v = df.set_index(['Team', 'LeadWeek', 'ConversionWeek'])\ .reindex(idx)\ .fillna(0)\ .reset_index() v.columns = df.columns v Team LeadWeek ConversionWeek Conversions 0 Team A 2017-12-01 0 2.0 1 Team A 2017-12-01 1 0.0 2 Team A 2017-12-01 2 1.0 3 Team A 2017-12-01 3 0.0 4 Team A 2017-12-01 4 1.0 5 Team A 2017-12-08 0 0.0 6 Team A 2017-12-08 1 0.0 7 Team A 2017-12-08 2 0.0 8 Team A 2017-12-08 3 2.0 9 Team A 2017-12-08 4 0.0 10 Team B 2017-12-01 0 1.0 11 Team B 2017-12-01 1 0.0 12 Team B 2017-12-01 2 3.0 13 Team B 2017-12-01 3 0.0 14 Team B 2017-12-01 4 0.0 15 Team B 2017-12-08 0 0.0 16 Team B 2017-12-08 1 3.0 17 Team B 2017-12-08 2 0.0 18 Team B 2017-12-08 3 2.0 19 Team B 2017-12-08 4 0.0 开关直接从文件中读取日期。

date -d @epochtime +format

为了让date --file了解这些行是大纪元时间,您需要在每行的开头添加$ cat file10 1515365117236 1515365123162 1515365139963

这可以像下面这样做:

date

或者,您可以在不影响原始文件的情况下即时执行此操作:

@

PS:在这种情况下,$ sed -i 's/^/@/g' file10 #caution - this will make changes in your file $ date --file file10 +"%Y-%m-%d %H:%M:%S" $ sed 's/^/@/g' file10 |date --file - +"%Y-%m-%d %H:%M:%S" == --file == pipe

读取

在这两种情况下,结果都是

-

PS:顺便说一句,你提供的时间戳似乎无效,因为它似乎是在49990年提及

答案 2 :(得分:0)

您的输入数据不是epoch unix时间,它有几毫秒。如果您希望首先在bash上使用任何方法,则必须转换为时间戳:

cat ff1.csv  | while read LINE; do echo "@$(expr $LINE \/ 1000)" | date +"%Y-%m-%d %H:%M:%S" --file - ;  done

首先除以1000以删除毫秒部分,其余部分与解释George Vasiliou相同

相关问题