如何创建strftime%j?

2024-04-29 22:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相对较大的10年的天气数据集,我想按一年中的每一天分组,以获得每一天的10年低点或高点,因此使用groupby我以这种方式创建了一个列:

df['dms'] = df['Date'].dt.strftime('%j')

问题是当我使用dt.strftime('%j')时,我会在同一天得到两个数字,这很奇怪,例如,当我只在12月31日之前过滤,我会value_counts(),我会得到以下结果:

365    363
366     82
Name: dms, dtype: int64

另一方面,如果我这样做,一切都会很好

Dec-31    445
Name: dm, dtype: int64

我甚至做了dt.strftime('%b-%d-%r').value_counts(),我得到了同样正确的过滤器

Dec-31-12:00:00 AM    445
Name: Date, dtype: int64

%j案的幕后到底发生了什么


Tags: 数据namedfdatevaluedtdmsdec
2条回答

让我们考虑以下数据:

df = pd.DataFrame({'Date' : ['2016-12-31', '2017-12-31', '2018-12-31', '2019-12-31', '2020-12-31']})
df['Date'] = pd.to_datetime(df['Date'])
df

    Date
0   2016-12-31
1   2017-12-31
2   2018-12-31
3   2019-12-31
4   2020-12-31

在上面的数据中,20162020是闰年,2月29日是额外的一天,以弥补实际年份为365天8小时的事实(因此每四年,闰年/闰日都存在,因为我们将前三年额外的8小时之和(3 X 8=24),这就是为什么我们有闰日!),因此,我们应该期望在上述几年内返回366%j,当我们这样做时:

import pandas as pd
df = pd.DataFrame({'Date' : ['2016-12-31', '2017-12-31', '2018-12-31', '2019-12-31', '2020-12-31']})
df['Date'] = pd.to_datetime(df['Date'])
df['Day'] = df['Date'].dt.strftime('%j')
df

    Date        Day
0   2016-12-31  366
1   2017-12-31  365
2   2018-12-31  365
3   2019-12-31  365
4   2020-12-31  366

但是,当您执行value_counts()时,它将返回:

365    3
366    2
Name: Day, dtype: int64

这也是预期的行为,因此%j在幕后正常工作,因为它适应闰年

%j返回年份001-366的日数(366表示闰年,365表示其他)。由于您的数据跨越10年,366将是闰年的有效日期

相关问题 更多 >