Мне удалось отфильтровать это до моего требования показывать месяц и год, изменяя dt.month на dt.strftime
df.join(df.apply(lambda x:
pd.Series(pd.date_range(x.StartDate,
x.EndDate,
freq='D')).dt.strftime('%b-%y'),1)
.apply(lambda x:
x.value_counts(),1)
.rename(columns=dict(enumerate(calendar.month_abbr))))
Однако на выходе теперь перечислены столбцы в алфавитном порядке, а не в январе до декабря по порядку года.
Любые идеи о том, как достичь этого, приветствуются
Во-первых, ваше вышесказанное, вы надеваете Вам нужно переименовать часть, потому что вы уже выполняете переименование при преобразовании в% m из серии дат.
Теперь проблема возникает с этим методом, когда вы вынимаете .dt.month, который возвращает «номер месяца», который используется для сортировки. Когда вы меняете это имя месяца использования, теперь вы делаете лексикографический вид. Итак, давайте переключимся на номер месяца (для сортировки) и сделаем небольшую лямбда-функцию для преобразования столбцов с номера месяца в имя.
df.join(df.apply(lambda x:
pd.Series(pd.date_range(x.StartDate,
x.EndDate,
freq='D')).dt.strftime('%m-%y'),1)
.apply(lambda x:
x.value_counts(),1)
.rename(columns=lambda x:
pd.to_datetime(x, format='%m-%y').strftime('%b-%y')))
Выход:
StartDate EndDate Days Mar-18 Apr-18 May-18 Jun-18
0 2018-03-20 00:36:00 2018-05-01 00:42:00 42.004167 12.0 30.0 1.0 NaN
1 2018-05-01 00:42:00 2018-06-04 17:15:38 34.690023 NaN NaN 31.0 4.0
2 2018-04-07 15:06:00 2018-05-09 17:01:00 32.079861 NaN 24.0 9.0 NaN
3 2018-03-21 04:36:00 2018-05-14 04:00:00 53.975000 11.0 30.0 13.0 NaN
4 2018-03-15 15:30:00 2018-05-08 08:30:00 53.708333 17.0 30.0 7.0 NaN
5 2018-05-08 08:30:00 2018-06-09 10:40:09 32.090382 NaN NaN 24.0 9.0
6 2018-03-21 09:00:00 2018-05-16 13:40:00 56.194444 11.0 30.0 16.0 NaN
7 2018-03-31 06:00:00 2018-05-26 16:30:00 56.437500 1.0 30.0 26.0 NaN
8 2018-03-14 18:18:00 2018-04-27 01:00:00 43.279167 18.0 26.0 NaN NaN
9 2018-04-07 15:00:00 2018-06-01 09:25:50 54.767940 NaN 24.0 31.0 NaN
10 2018-03-22 07:30:00 2018-05-20 19:00:00 59.479167 10.0 30.0 20.0 NaN
Что вы ищете для идентификаторов узлов (см. http://www.w3.org/TR/json-ld/#node-identifiers ). Вы назначаете каждому объекту уникальный идентификатор в виде URL-адреса и используете его в ссылках:
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@id": "http://event.com/#mainEvent",
"@type": "Event",
"name": "MainEvent",
"startDate": "2016-04-21T12:00",
"location": {
...
}
}
</script>
Вы видите, что я дал событию @id
. Я добавил фрагмент (#mainEvent
), потому что http://event.com/
обычно идентифицировал бы страницу. Затем вы можете ссылаться на событие следующим образом:
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Event",
"name": "SubEvent",
"startDate": "2016-04-21T12:00",
"location": {
...
}
superEvent {
"@id": "http://event.com/#mainEvent"
}
}
</script>
Встраивание, как показано в вашем примере, также работает. В этом случае вам не понадобятся идентификаторы, так как ясно, какие ссылки какие.
Вы можете идентифицировать узел, указав ему URI, указанный в ключе @id
. Этот URI можно использовать для ссылки на этот узел.
См. Раздел « Идентификаторы узлов » в спецификации JSON-LD.
Таким образом, ваше главное событие может получить URI http://example.com/2016-04-21#main-event
:
<script type="application/ld+json">
{
"@id": "http://example.com/2016-04-21#main-event",
"@context": "http://schema.org",
"@type": "Event",
"name": "MainEvent",
"startDate": "2016-04-21T12:00"
}
</script>
, и вы можете дать этот URI как значение свойства superEvent
дополнительного события:
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Event",
"name": "SubEvent",
"startDate": "2016-04-21T12:00",
"superEvent": { "@id": "http://example.com/2016-04-21#main-event" }
}
</script>
(Конечно, вы могли бы дайте вашему вспомогательному событию значение @id
. Это позволит вам и другим пользователям идентифицировать / ссылаться на это вспомогательное событие.)