Локализация дескрипторов формата даты

Чтобы выбрать строки, значение столбца которых равно скаляру, some_value, используйте ==:

df.loc[df['column_name'] == some_value]

Чтобы выбрать строки, значение столбца которых в итерабельном, some_values, используйте isin:

df.loc[df['column_name'].isin(some_values)]

Объединить несколько условий с &:

df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

Выбрать строки, значение столбца не равно some_value, используйте !=:

df.loc[df['column_name'] != some_value]

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

df.loc[~df['column_name'].isin(some_values)]

Например,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

дает

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Если у вас несколько значений вы хотите включить, поместить их в список (или, в более общем плане, любой итерабельный) и использовать isin:

print(df.loc[df['B'].isin(['one','three'])])

дает

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

Примечание, однако, если вы хотите сделать это много раз, более эффективно сначала сделать индекс, а затем использовать df.loc:

df = df.set_index(['B'])
print(df.loc['one'])

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

или, чтобы включить несколько значений из использования индекса df.index.isin:

df.loc[df.index.isin(['one','two'])]

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12
17
задан Rachel Gallen 23 July 2015 в 10:02
поделиться

7 ответов

Вот мой существующий метод. Какие-либо предложения?

Regex singleMToDoubleRegex = new Regex("(?<!m)m(?!m)");
Regex singleDToDoubleRegex = new Regex("(?<!d)d(?!d)");
CultureInfo currentCulture = CultureInfo.CurrentUICulture;

// If the culture is netural there is no date pattern to use, so use the default.
if (currentCulture.IsNeutralCulture)
{
    currentCulture = CultureInfo.InvariantCulture;
}

// Massage the format into a more general user friendly form.
string shortDatePattern = CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern.ToLower();
shortDatePattern = singleMToDoubleRegex.Replace(shortDatePattern, "mm");
shortDatePattern = singleDToDoubleRegex.Replace(shortDatePattern, "dd");
2
ответ дан 30 November 2019 в 14:07
поделиться

Просто использование ISO 8601 . Это - международный стандарт.

Date and time (current at page generation) expressed according to ISO 8601:
Date:                           2014-07-05
Combined date and time in UTC:  2014-07-05T04:00:25+00:00
                                2014-07-05T04:00:25Z
Week:                           2014-W27
Date with week number:          2014-W27-6
Ordinal date:                   2014-186
7
ответ дан 30 November 2019 в 14:07
поделиться

Проблема с международными стандартами состоит в том, что в значительной степени никто не использует их. Я пробую, где я могу, но я вынужден использовать dd/mm/yyyy почти везде в реальной жизни, что означает, что я так привык к нему, это всегда - сознательный процесс для использования ISO 8601. Для большинства людей, которые даже не пытаются использовать ISO 8601, это еще хуже. Если можно интернационализировать, где Вы можете, я думать, что это - большое преимущество.

2
ответ дан 30 November 2019 в 14:07
поделиться

Как насчет того, чтобы дать формат (mm/dd/yyyy или dd/mm/yyyy) сопровождаемый распечаткой сегодняшней даты в культуре пользователя. MSDN имеет статью о форматирование DateTime для культуры человека , с помощью объекта CultureInfo, который мог бы быть полезным в выполнении этого. Комбинация формата (с которым большинство людей знакомо) объединенный с текущей датой, представленной в том формате, должна быть действительно ключом к разгадке человека о том, как они должны ввести дату. (Также включайте календарное управление для тех, которые все еще наклон понимает это).

1
ответ дан 30 November 2019 в 14:07
поделиться

Краткая форма удобна и помогает избежать орфографических ошибок. Локализуйте как применимые, но убеждаться отобразить ожидаемый формат (не оставляйте пользователя слепым). Обеспечьте управление средства выбора даты как дополнительный помощник в заполнении поля.

, Поскольку дополнительный, непрерывный парсинг и дисплей даты в подробной форме могли бы помочь также.

1
ответ дан 30 November 2019 в 14:07
поделиться

Я должен согласовать с OP 'неправильные' даты действительно банка с моим DD/MM/YYYY воспитанием, и я нахожу даты и время ISO 8601 чрезвычайно легкими работать с. На этот раз стандарт разобрался в нем и , engtech имеет очевидный ответ, который не требует локализации.

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

4
ответ дан 30 November 2019 в 14:07
поделиться

Наилучший вариант : Я вместо этого рекомендовал бы использовать стандартное средство выбора даты.

Альтернатива : каждый раз содержание изменений средств редактирования, анализируют его и дисплей (в отдельном управлении?) длинный формат даты (т.е.: вход "03/04/09" отображает "Ваш вход: 4 марта 2009")

0
ответ дан 30 November 2019 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: