Python:日期时间到季节

新手上路,请多包涵

我想将日期时间序列转换为季节,例如第 3、4、5 个月我想用 2(春季)替换它们;对于第 6、7、8 个月,我想用 3(夏季)等替换它们。

所以,我有这个系列

id
1       2011-08-20
2       2011-08-23
3       2011-08-27
4       2011-09-01
5       2011-09-05
6       2011-09-06
7       2011-09-08
8       2011-09-09
Name: timestamp, dtype: datetime64[ns]

这是我一直在尝试使用的代码,但无济于事。

 # Get seasons
spring = range(3, 5)
summer = range(6, 8)
fall = range(9, 11)
# winter = everything else

month = temp2.dt.month
season=[]

for _ in range(len(month)):
    if any(x == spring for x in month):
       season.append(2) # spring
    elif any(x == summer for x in month):
        season.append(3) # summer
    elif any(x == fall for x in month):
        season.append(4) # fall
    else:
        season.append(1) # winter

for _ in range(len(month)):
    if month[_] == 3 or month[_] == 4 or month[_] == 5:
        season.append(2) # spring
    elif month[_] == 6 or month[_] == 7 or month[_] == 8:
        season.append(3) # summer
    elif month[_] == 9 or month[_] == 10 or month[_] == 11:
        season.append(4) # fall
    else:
        season.append(1) # winter

这两种解决方案都不起作用,特别是在第一个实现中我收到一个错误:

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

而第二个是一个包含错误的大列表。有什么想法吗?谢谢

原文由 Jespar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您可以使用一个简单的数学公式将一个月压缩为一个季节,例如:

 >>> [month%12 // 3 + 1 for month in range(1, 13)]
[1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1]

因此,对于使用向量操作的用例(信用@DSM):

 >>> temp2.dt.month%12 // 3 + 1
1    3
2    3
3    3
4    4
5    4
6    4
7    4
8    4
Name: id, dtype: int64

原文由 AChampion 发布,翻译遵循 CC BY-SA 4.0 许可协议

也可以使用字典映射。

  1. 创建一个将月份映射到季节的字典:
    In [27]: seasons = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1]

   In [28]: month_to_season = dict(zip(range(1,13), seasons))

   In [29]: month_to_season
   Out[29]: {1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 3, 7: 3, 8: 3, 9: 4, 10: 4, 11: 4, 12: 1}

  1. 用它来将月份转换为季节
   In [30]: df.id.dt.month.map(month_to_season)
   Out[30]:
   1    3
   2    3
   3    3
   4    4
   5    4
   6    4
   7    4
   8    4
   Name: id, dtype: int64


性能:这是相当快的

In [35]: %timeit df.id.dt.month.map(month_to_season)
1000 loops, best of 3: 422 µs per loop

原文由 Mohamed Ali JAMAOUI 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题