我有时间记录时间戳(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
这需要花费大量时间,只需追加当前时间
答案 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相同