Python:季节的日期时间

Jes*_*par 6 python datetime pandas

我想将日期时间序列转换为季节,例如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]
Run Code Online (Sandbox Code Playgroud)

这是我一直试图使用的代码,但无济于事.

# 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

而在第二个是一个有错误的大型列表.有什么想法吗?谢谢

ACh*_*ion 20

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

>>> [(month%12 + 3)//3 for month in range(1, 13)]
[1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1]
Run Code Online (Sandbox Code Playgroud)

所以对于你的用例:

>>> temp2.apply(lambda dt: (dt.month%12 + 3)//3)
1    3
2    3
3    3
4    4
5    4
6    4
7    4
8    4
Name: id, dtype: int64
Run Code Online (Sandbox Code Playgroud)

或者使用向量运算(credit @DSM):

>>> (temp2.dt.month%12 + 3)//3
1    3
2    3
3    3
4    4
5    4
6    4
7    4
8    4
Name: id, dtype: int64
Run Code Online (Sandbox Code Playgroud)

  • 为什么在这里使用`apply`而不是直接使用向量操作? (3认同)
  • 那太棒了 (2认同)

Moh*_*OUI 7

也可以使用字典映射。

\n\n
    \n
  1. 创建一个将月份映射到季节的字典:

    \n\n
    In [27]: seasons = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1]\n\nIn [28]: month_to_season = dict(zip(range(1,13), seasons))\n\nIn [29]: month_to_season \nOut[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}\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 用它来将月份转换为季节

    \n\n
    In [30]: df.id.dt.month.map(month_to_season) \nOut[30]: \n1    3\n2    3\n3    3\n4    4\n5    4\n6    4\n7    4\n8    4\nName: id, dtype: int64\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n\n
\n\n

性能:相当快

\n\n
In [35]: %timeit df.id.dt.month.map(month_to_season) \n1000 loops, best of 3: 422 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n