2015-09-17 5 views
0

Можно ли представить pd.to_datetime с суффиксом нулей? Кажется, что нули удаляются.Форматирование даты и времени Pandas

print pd.to_datetime("2000-07-26 14:21:00.00000", 
       format="%Y-%m-%d %H:%M:%S.%f") 

В результате

2000-07-26 14:21:00 

Желаемый результат будет

2000-07-26 14:21:00.00000 

Я знаю, что значения означают то же самое, но было бы неплохо для последовательности.

+0

Вы можете разместить свой вывод, как это может быть просто дисплей вопрос – EdChum

ответ

0

Выполнение некоторых тестов показывает, что при форматировании данных даты и времени с форматом = "% H:% M:% S.% f",% f способен наносекундное разрешение при условии, что девятая цифра после десятичной точки - нуль. При форматировании строки добавляется переменное число конечных нулей от ни одного до пяти в зависимости от положения младшей значащей цифры после десятичной точки и при условии, что она также является последней цифрой. Вот таблица, которая на основании данных испытаний, где позиция является позицией наименее значимой ненулевой, а также конечной цифры и нулей числа конечных нулей, добавленных при форматировании:

position zeros 
     9  0 
     8  1 
     7  2 
     6  0 
     5  1 
     4  2 
     3  3 
     2  4 
     1  5 

Когда столбец отформатирован с " % H:% M:% S.% f "в целом, все его элементы будут иметь одинаковое количество цифр после десятичной точки, что может быть сделано путем добавления или удаления конечных нулей, даже если это увеличивает или уменьшает разрешение необработанных данных. Я предполагаю, что причиной этого являются согласованность и приятная эстетика, нередко вводя чрезмерную ошибку, поскольку в числовых вычислениях конечные нули обычно не влияют на непосредственные результаты, однако они могут повлиять на оценку их ошибки и то, как они должны быть представлены (Trailing Zeros, Rules for Significant Figures).

Ниже приведены некоторые примеры применения формата «% H:% M:% S.% f» для отдельных строк и pandas.Series (столбцы DataFrame) с помощью pandas.to_datetime и применения pandas.DataFrame.convert_objects (convert_dates = ' coerce ') в DataFrames со столбцом, который может быть преобразован в datetime.

На струнной панде сохраняется цифра с нулевым разрядом до девятого десятичного знака с временным преобразованием с «% H:% M:% S.% f» и добавляется дата, если одна из них не была предоставлена:

import pandas as pd 
pd.to_datetime ("10:00:00.000000001",format="%H:%M:%S.%f") 
Out[15]: Timestamp('1900-01-01 10:00:00.000000001') 

pd.to_datetime ("2015-09-17 10:00:00.000000001",format="%Y-%m-%d %H:%M:%S.%f") 
Out[15]: Timestamp('2015-09-17 10:00:00.000000001') 

до этого и для испытаний, в которых конечная ненулевая цифра окончательной цифра, она добавляет до пяти замыкающих нулей после последней ненулевой цифры увеличения разрешающей способностью исходных данных, кроме случаев, когда окончательного отличная от нуля цифра находится в положении шесть справа от знака после запятой:

pd.to_datetime ("10:00:00.00000001",format="%H:%M:%S.%f") 
Out[15]: Timestamp('1900-01-01 10:00:00.000000010') 

pd.to_datetime ("2015-09-17 10:00:00.00000001",format="%Y-%m-%d %H:%M:%S.%f") 
Out[16]: Timestamp('2015-09-17 10:00:00.000000010') 

pd.to_datetime ("10:00:00.0000001",format="%H:%M:%S.%f") 
Out[15]: Timestamp('1900-01-01 10:00:00.000000100') 

pd.to_datetime ("2015-09-17 10:00:00.0000001",format="%Y-%m-%d %H:%M:%S.%f") 
Out[17]: Timestamp('2015-09-17 10:00:00.000000100') 

pd.to_datetime ("10:00:00.000001",format="%H:%M:%S.%f") 
Out[33]: Timestamp('1900-01-01 10:00:00.000001') 

pd.to_datetime ("2015-09-17 10:00:00.000001",format="%Y-%m-%d %H:%M:%S.%f") 
Out[18]: Timestamp('2015-09-17 10:00:00.000001') 

pd.to_datetime ("10:00:00.00001",format="%H:%M:%S.%f") 
Out[6]: Timestamp('1900-01-01 10:00:00.000010') 

pd.to_datetime ("2015-09-17 10:00:00.00001",format="%Y-%m-%d %H:%M:%S.%f") 
Out[19]: Timestamp('2015-09-17 10:00:00.000010') 

pd.to_datetime ("10:00:00.0001",format="%H:%M:%S.%f") 
Out[9]: Timestamp('1900-01-01 10:00:00.000100') 

pd.to_datetime ("2015-09-17 10:00:00.0001",format="%Y-%m-%d %H:%M:%S.%f") 
Out[21]: Timestamp('2015-09-17 10:00:00.000100') 

pd.to_datetime ("10:00:00.001",format="%H:%M:%S.%f") 
Out[10]: Timestamp('1900-01-01 10:00:00.001000') 

pd.to_datetime ("2015-09-17 10:00:00.001",format="%Y-%m-%d %H:%M:%S.%f") 
Out[22]: Timestamp('2015-09-17 10:00:00.001000') 

pd.to_datetime ("10:00:00.01",format="%H:%M:%S.%f") 
Out[12]: Timestamp('1900-01-01 10:00:00.010000') 

pd.to_datetime ("2015-09-17 10:00:00.01",format="%Y-%m-%d %H:%M:%S.%f") 
Out[24]: Timestamp('2015-09-17 10:00:00.010000' 

pd.to_datetime ("10:00:00.1",format="%H:%M:%S.%f") 
Out[13]: Timestamp('1900-01-01 10:00:00.100000') 

pd.to_datetime ("2015-09-17 10:00:00.1",format="%Y-%m-%d %H:%M:%S.%f") 
Out[26]: Timestamp('2015-09-17 10:00:00.100000') 

Позвольте se е, как она работает с DataFrame:

!type test.csv # here type is Windows substitute for Linux cat command 
date,mesg 
10:00:00.000000001,one 
10:00:00.00000001,two 
10:00:00.0000001,three 
10:00:00.000001,four 
10:00:00.00001,five 
10:00:00.0001,six 
10:00:00.001,seven 
10:00:00.01,eight 
10:00:00.1,nine 
10:00:00.000000001,ten 
10:00:00.000000002,eleven 
10:00:00.000000003,twelve 

df = pd.read_csv('test.csv') 
df 
Out[30]: 
        date mesg 
0 10:00:00.000000001  one 
1 10:00:00.00000001  two 
2  10:00:00.0000001 three 
3  10:00:00.000001 four 
4  10:00:00.00001 five 
5  10:00:00.0001  six 
6   10:00:00.001 seven 
7   10:00:00.01 eight 
8   10:00:00.1 nine 
9 10:00:00.000000001  ten 
10 10:00:00.000000002 eleven 
11 10:00:00.000000003 twelve 

df.dtypes 
Out[31]: 
date object 
mesg object 
dtype: object 

Datetime преобразования DataFrame с convert_objects, который не имеет опций формата, обеспечивает разрешение микросекунд, даже если некоторые исходные данные имеют разрешение меньше или больше, чем это, и добавляют текущую дату:

df2 = df.convert_objects(convert_dates='coerce') 
df2 
Out[32]: 
        date mesg 
0 2015-09-17 10:00:00.000000  one 
1 2015-09-17 10:00:00.000000  two 
2 2015-09-17 10:00:00.000000 three 
3 2015-09-17 10:00:00.000001 four 
4 2015-09-17 10:00:00.000010 five 
5 2015-09-17 10:00:00.000100  six 
6 2015-09-17 10:00:00.001000 seven 
7 2015-09-17 10:00:00.010000 eight 
8 2015-09-17 10:00:00.100000 nine 
9 2015-09-17 10:00:00.000000  ten 
10 2015-09-17 10:00:00.000000 eleven 
11 2015-09-17 10:00:00.000000 twelve 

df2.dtypes 
Out[33]: 
date datetime64[ns] 
mesg   object 
dtype: object 

большее разрешение значений элементов в столбце DataFrame, созданный из необработанных данных, некоторые из которых имеет больше, чем разрешение микросекунд не может быть восстановлен с «% H:% M:% S.% F» форматирования после преобразования даты и времени сделано без явного спецификатора формата (то есть с DataFrame.convert_objects):

df2['date'] = pd.to_datetime(df2['date'],format="%H:%M:%S.%f") 
df2 
Out[34]: 
         date mesg 
0 2015-09-17 10:00:00.000000  one 
1 2015-09-17 10:00:00.000000  two 
2 2015-09-17 10:00:00.000000 three 
3 2015-09-17 10:00:00.000001 four 
4 2015-09-17 10:00:00.000010 five 
5 2015-09-17 10:00:00.000100  six 
6 2015-09-17 10:00:00.001000 seven 
7 2015-09-17 10:00:00.010000 eight 
8 2015-09-17 10:00:00.100000 nine 
9 2015-09-17 10:00:00.000000  ten 
10 2015-09-17 10:00:00.000000 eleven 
11 2015-09-17 10:00:00.000000 twelve 

Форматирование DataFrame colume с «% H:% M:% S.% F» перед преобразованием даты и времени обеспечивает разрешение наносекунд, если по крайней мере, один элемент имеет ненулевую цифру в девятом месте (как рекламируется в pandas.to_datetime documentation), но также увеличивает разрешение необработанных данных с меньшими затратами, чем наносекундным разрешением на этом уровне и добавляет 1900-01-01 в качестве даты:

df3 = df.copy(deep=True) 
df3['date'] = pd.to_datetime(df3['date'],format="%H:%M:%S.%f",coerce=True) 
df3 
Out[35]: 
          date mesg 
0 1900-01-01 10:00:00.000000001  one 
1 1900-01-01 10:00:00.000000010  two 
2 1900-01-01 10:00:00.000000100 three 
3 1900-01-01 10:00:00.000001000 four 
4 1900-01-01 10:00:00.000010000 five 
5 1900-01-01 10:00:00.000100000  six 
6 1900-01-01 10:00:00.001000000 seven 
7 1900-01-01 10:00:00.010000000 eight 
8 1900-01-01 10:00:00.100000000 nine 
9 1900-01-01 10:00:00.000000001  ten 
10 1900-01-01 10:00:00.000000002 eleven 
11 1900-01-01 10:00:00.000000003 twelve 

Форматирование столбца DataFrame с «% H:% M:% S.% f "добавляет нули после нулевой точки с наименьшей значащей ненулевой цифрой после десятичной точки (по всему столбцу и нулям добавляются по позиции ition: нули таблица выше) и выравнивает разрешение всех других данных, с тем, что даже если это увеличивает или уменьшает разрешение некоторых исходных данных:

df4 = pd.read_csv('test2.csv') 
df4 
Out[36]: 
        date mesg 
0 10:00:00.000000000  one 
1 10:00:00.00000000  two 
2  10:00:00.0000000 three 
3  10:00:00.000000 four 
4  10:00:00.00000 five 
5  10:00:00.0001  six 
6   10:00:00.00 seven 
7   10:00:00.0 eight 
8   10:00:00. nine 
9 10:00:00.000000000  ten 
10 10:00:00.000000000 eleven 
11 10:00:00.00000000 twelve 

df4['date'] = pd.to_datetime(df4['date'],format="%H:%M:%S.%f",coerce=True) 
df4 
Out[37]: 
         date mesg 
0 1900-01-01 10:00:00.000000  one 
1 1900-01-01 10:00:00.000000  two 
2 1900-01-01 10:00:00.000000 three 
3 1900-01-01 10:00:00.000000 four 
4 1900-01-01 10:00:00.000000 five 
5 1900-01-01 10:00:00.000100  six 
6 1900-01-01 10:00:00.000000 seven 
7 1900-01-01 10:00:00.000000 eight 
8       NaT nine # nothing after decimal point in raw data 
9 1900-01-01 10:00:00.000000  ten 
10 1900-01-01 10:00:00.000000 eleven 
11 1900-01-01 10:00:00.000000 twelve 

При попытке это с тем же DataFrame с, но с датами, включенной в столбец даты, то же самое произошло:

df25 
Out[38]: 
          date mesg 
0 2015-09-10 10:00:00.000000000  one 
1 2015-09-11 10:00:00.00000000  two 
2  2015-09-12 10:00:00.0000000 three 
3  2015-09-13 10:00:00.000000 four 
4  2015-09-14 10:00:00.00000 five 
5  2015-09-15 10:00:00.0001  six 
6   2015-09-16 10:00:00.00 seven 
7   2015-09-17 10:00:00.0 eight 
8   2015-09-18 10:00:00. nine 
9 2015-09-19 10:00:00.000000000  ten 
10 2015-09-20 10:00:00.000000000 eleven 
11 2015-09-21 10:00:00.00000000 twelve 

df25['date'] = pd.to_datetime(df25['date'],format="%Y-%m-%d %H:%M:%S.%f",coerce=True) 
df25 
Out[39]: 
         date mesg 
0 2015-09-10 10:00:00.000000  one 
1 2015-09-11 10:00:00.000000  two 
2 2015-09-12 10:00:00.000000 three 
3 2015-09-13 10:00:00.000000 four 
4 2015-09-14 10:00:00.000000 five 
5 2015-09-15 10:00:00.000100  six 
6 2015-09-16 10:00:00.000000 seven 
7 2015-09-17 10:00:00.000000 eight 
8       NaT nine # nothing after decimal point in raw data 
9 2015-09-19 10:00:00.000000  ten 
10 2015-09-20 10:00:00.000000 eleven 
11 2015-09-21 10:00:00.000000 twelve 

Когда нет сырьевой датум не имеет ненулевую значащей цифры после запятой, форматирование с помощью столбца DataFrame «% H:% M:% S.% F» может равномерно обеспечить только два нуля после десятичной точки для всех данных, даже если это увеличивает или уменьшает разрешение некоторых исходных данных:

df5 = pd.read_csv('test3.csv') 
df5 
Out[40]: 
        date mesg 
0   10:00:00.000  one 
1   10:00:00.0  two 
2   10:00:00.000 three 
3   10:00:00.000 four 
4   10:00:00.00 five 
5   10:00:00.000  six 
6   10:00:00.00 seven 
7   10:00:00.0 eight 
8   10:00:00.0 nine 
9 10:00:00.000000000  ten 
10  10:00:00.000 eleven 
11  10:00:00.000 twelve 

df5['date'] = pd.to_datetime(df5['date'],format="%H:%M:%S.%f",coerce=True) 
df5 
Out[41]: 
        date mesg 
0 1900-01-01 10:00:00  one 
1 1900-01-01 10:00:00  two 
2 1900-01-01 10:00:00 three 
3 1900-01-01 10:00:00 four 
4 1900-01-01 10:00:00 five 
5 1900-01-01 10:00:00  six 
6 1900-01-01 10:00:00 seven 
7 1900-01-01 10:00:00 eight 
8 1900-01-01 10:00:00 nine 
9 1900-01-01 10:00:00  ten 
10 1900-01-01 10:00:00 eleven 
11 1900-01-01 10:00:00 twelve 

То же самое произошло, когда делать это испытание с тем же DataFrame, но с датами, включенных в колонку дата:

df45 
Out[42]: 
          date mesg 
0   2015-09-10 10:00:00.000  one 
1   2015-09-11 10:00:00.0  two 
2   2015-09-12 10:00:00.000 three 
3   2015-09-13 10:00:00.000 four 
4   2015-09-14 10:00:00.00 five 
5   2015-09-15 10:00:00.000  six 
6   2015-09-16 10:00:00.00 seven 
7   2015-09-17 10:00:00.0 eight 
8   2015-09-18 10:00:00.0 nine 
9 2015-09-19 10:00:00.000000000  ten 
10  2015-09-20 10:00:00.000 eleven 
11  2015-09-21 10:00:00.000 twelve 

df45['date'] = pd.to_datetime(df45['date'],format="%Y-%m-%d %H:%M: %S.%f",coerce=True) 
df45 
Out[43]: 
        date mesg 
0 2015-09-10 10:00:00  one 
1 2015-09-11 10:00:00  two 
2 2015-09-12 10:00:00 three 
3 2015-09-13 10:00:00 four 
4 2015-09-14 10:00:00 five 
5 2015-09-15 10:00:00  six 
6 2015-09-16 10:00:00 seven 
7 2015-09-17 10:00:00 eight 
8 2015-09-18 10:00:00 nine 
9 2015-09-19 10:00:00  ten 
10 2015-09-20 10:00:00 eleven 
11 2015-09-21 10:00:00 twelve 
0

Жаль не хватает респ комментировать, так что я буду просто пытаться мой ответ здесь , Полностью согласен с EdChum, это проблема с отображением. Если вы попробуете:

pd.to_datetime ("10:00:00.00001",format="%H:%M:%S.%f") 

Ответ должен быть:

Отметка ('1900-01-01 10: 00: 00,000010')

Смежные вопросы