【问题标题】:Need help iterating over a dataframe to get just the date需要帮助迭代数据框以获取日期
【发布时间】:2019-09-18 21:14:26
【问题描述】:

我有一个从 sqlite3 查询创建的 pandas 数据框 date_win。它看起来像这样:

             0
0   2011-01-29
1   2011-03-19
2   2011-05-07
3   2011-02-19
4   2011-03-12
5   2011-01-22
6   2011-04-17

我想对其进行迭代以获取日期,转换为 unix 并将其放入 Dark Sky api。当我得到日期并分配给一个变量并放入我的日期时间转换时,错误是:

ValueError: 时间数据 '0 2011-01-29\nName: 0, dtype: object' 与格式 '%Y-%m-%d' 不匹配

我尝试过使用这个 for 循环: for i in range(0,len(date_win)):

并且: for i in date_win:

这是我的完整代码sn-p:

for i in range(0,len(date_win)):

    s = str(date_win.iloc[i])


    dt = round(time.mktime(datetime.datetime.strptime(s, "%Y-%m-%d").timetuple()))
    dt = str(dt)
    resp = requests.get('https://api.darksky.net/forecast/[my_key]/52.52,13.4050,' + dt)
    data=resp.json()
    print(data['currently']['summary'])

这里是错误代码:

ValueError: 时间数据 '0 2011-01-29\nName: 0, dtype: object' 与格式 '%Y-%m-%d' 不匹配

如果我在 api 请求中使用s = "2011-01-01" 或硬编码,则 api 调用有效。我只是没有正确地进行迭代。

【问题讨论】:

  • 请正确格式化您的代码并正确格式化示例数据

标签: python pandas datetime python-datetime


【解决方案1】:

您可以使用strftime将一列格式化的日期字符串输出到列表中

例如

d = ['2009-08-19',
    '2005-06-04',
    '2003-04-05']
​
df = pd.DataFrame(d, columns=['dates'])
df['dates'] = pd.to_datetime(df['dates'])  

         dates
0   2009-08-19
1   2005-06-04
2   2003-04-05

dates = df['dates'].dt.strftime('%Y-%m-%d').values

通过在系列中使用.valuesdates 将是一个普通的 Python 格式化字符串列表,然后您可以正常循环并将它们应用到您的 API。

如果您想将字符串保留在数据框中,您可以分配另一列

df['formatted'] = df['dates'].dt.strftime('%Y-%m-%d')

值得注意的是,您可以使用itertuples 或类似方法来循环数据帧。

【讨论】:

  • Elembie,感谢您的快速回复。我尝试了您的代码建议并使用了“for”循环 - 这次没有错误,但所有日期都显示为“NaT”。
  • 我认为您的日期可能不会在您的数据框中存储为 datetime 对象。您是否在我的代码第二行中添加了pd.to_datetime 函数?确保将输出保存到您想要导出的列中。要检查数据框列的数据类型,您可以print(df.dtypes)。它们应该类似于datetime64[ns]
  • 是的。我这样做了。我正在使用 sqlite3,这可能是问题的一部分(是否支持日期时间对象?)?我已经请一位讲师查看我的代码并帮助我解决这个问题以及我遇到的另一个问题。如果我弄明白了,我会发布我的更新。非常感谢。
  • sqlite 绝对支持datetime - 无论如何,您已经在 pandas 对象中拥有数据,因此您应该能够转换为您想要的任何 pandas 支持的对象类型。只需仔细检查所有列引用,并在所有阶段打印出数据框和df.dtypes,以检查您没有遗漏任何内容。如果你弄明白了,请告诉我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多