【问题标题】:Create datetime column from month and day with year based on month从月份和日期创建日期时间列,年份基于月份
【发布时间】:2018-10-15 09:25:05
【问题描述】:

我有如图所示的 mm-dd 形式的日期的柱状数据。我需要添加正确的年份(10 月到 12 月的日期是 2017 年,1-1 之后的日期是 2018 年)并创建一个日期时间对象。下面的代码有效,但很难看。有没有更 Pythonic 的方式来实现这一点?

import pandas as pd
from datetime import datetime
import io

data = '''Date
1-3
1-2
1-1
12-21
12-20
12-19
12-18'''

df = pd.read_csv(io.StringIO(data))

for i,s in enumerate(df.Date):
    s = s.split('-')
    if int(s[0]) >= 10:
        s = s[0]+'-'+s[1]+'-17'
    else:
        s = s[0]+'-'+s[1]+'-18'
    df.Date[i] = pd.to_datetime(s)
    print(df.Date[i])

打印:

2018-01-03 00:00:00
2018-01-02 00:00:00
2018-01-01 00:00:00
2017-12-21 00:00:00
2017-12-20 00:00:00
2017-12-19 00:00:00
2017-12-18 00:00:00

【问题讨论】:

  • 您的日期是否比玩具data 中显示的日期多,还是您感兴趣的日期的全包列表?
  • 我将每周阅读大约 2 次 Excel 文件,比较今年和去年的入学数据。我只是在 OP 中放了一个最小的例子。

标签: python pandas datetime dataframe string-to-datetime


【解决方案1】:

您可以将日期转换为 pandas datetimeobjects。然后用datetime.replace 修改他们的年份。请参阅docs 了解更多信息。

您可以使用以下代码:

df['Date'] = pd.to_datetime(df['Date'], format="%m-%d")
df['Date'] = df['Date'].apply(lambda x: x.replace(year=2017) if x.month in(range(10,13)) else x.replace(year=2018))

输出:

       Date
0   2018-01-03
1   2018-01-02
2   2018-01-01
3   2017-12-21
4   2017-12-20
5   2017-12-19
6   2017-12-18

【讨论】:

    【解决方案2】:

    这是使用pandas矢量化功能的一种方式:

    df['Date'] = pd.to_datetime(df['Date'] + \
                 np.where(df['Date'].str.split('-').str[0].astype(int).between(10, 12),
                          '-2017', '-2018'))
    
    print(df)
    
            Date
    0 2018-01-03
    1 2018-01-02
    2 2018-01-01
    3 2017-12-21
    4 2017-12-20
    5 2017-12-19
    6 2017-12-18
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多