繁体   English   中英

如何使用Pandas从yyyy-mm-dd中查找一年中的天数?

[英]How to find the number of the day in a year from yyyy-mm-dd using Pandas?

我有此数据:

Date        Time      VCD    
20041001    184531      293.7
20041001    202316      305.4
20041002    175015      322.9
20041002    192822      316.6
20041003    183314      334.4

我正在使用此代码

import pandas as pd
import numpy as np
import datetime as dt
frame1=pd.DataFrame(data1, columns=['Date','Time','VCD'])
clw1 = frame1.drop_duplicates('Date', keep='last')

使用clw1删除带有新列'DateTime'的重复数据yyyy-mm-dd

Date        Time      VCD       DateTime
20041001    184531      293.7   2004-10-01
20041002    175015      322.9   2004-10-02
20041003    183314      334.4   2004-10-03

我正在尝试获取年份的日期,月份的数量和月份的日期(在frame1中添加相应的列,例如,在frame1中为年份中的天添加新列(2001.1 .... 365))

frame1['doye'] = frame1['DateTime'].apply(lambda x: dt.DatetimeIndex.dayofyear('DateTime'))

但是错误:AttributeError:Pandas 0.20.2版本的模块'datetime'没有属性'DatetimeIndex'可能我对Pandas和datetime的概念有疑问,许多解决方案建议使用单独的数据(值)或对于旧的Pandas版本,如何我是否使用dataframe处理列?

这是一种方法。 %j格式代码提供每年的日期。

>>> import pandas as pd
>>> df = pd.DataFrame(['20041001', '20041002', '20041003'])
>>> df[0] = pd.to_datetime(df[0])
>>> df
           0
0 2004-10-01
1 2004-10-02
2 2004-10-03
>>> df['day_of_year'] = df[0].apply(lambda x: int(datetime.datetime.strftime(x,'%j')))
>>> df
           0  day_of_year
0 2004-10-01          275
1 2004-10-02          276
2 2004-10-03          277

方法1:使用apply()(不如方法2那样好)

尝试使用此:

frame1["doye"] = frame1.DateTime.apply(lambda s: s.timetuple().tm_yday)

这会将一个函数应用于DateTime列,因此lambda将返回col中的每个datetime。 因此s是一个DateTime对象。 我使用timetuple()函数获取一个time.struct_time对象,该对象具有成员tm_yday来提供一年中的日期。

这是我的(草率的)测试代码:

将numpy导入为np

import datetime as dt

data1 = [ {"Date" : "20041001", "Time" : 184531}]

frame1=pd.DataFrame(data1, columns=['Date','Time'])
frame1["DateTime"]= pd.to_datetime(frame1.Date, format="%Y%m%d", errors='raise')
print frame1
frame1["doye"] = frame1.DateTime.apply(lambda s: s.timetuple().tm_yday)
print frame1

输出为:

       Date    Time   DateTime
0  20041001  184531 2004-10-01
       Date    Time   DateTime  doye
0  20041001  184531 2004-10-01   275

方法2:使用.dt(更好:))

嗯,在这里阅读.dt访问器...熊猫系列的.dt访问器将系列的每个成员都视为日期时间,因此,当将其应用于整个系列时,所有内容都必须是日期时间。 当您将其应用于系列中的列时, apply()函数将获取datetime对象,而不是系列,因此必须使用datetime方法。

因此,我们不要使用apply() 选择日期时间的列将为您提供一系列,然后可以使用.dt打开,因此示例变为:

import pandas as pd
import numpy as np
import datetime as dt

data1 = [ {"Date" : "20041001", "Time" : 184531}]

frame1=pd.DataFrame(data1, columns=['Date','Time'])
frame1["DateTime"]= pd.to_datetime(frame1.Date, format="%Y%m%d", errors='raise')
print frame1
frame1["doye"] = frame1.DateTime.dt.dayofyear
print frame1

下面的代码应执行您期望的所有步骤:

import pandas as pd
import datetime as dt
frame1 = pd.DataFrame({"Date" : [20041001, 20041001, 20041002, 20041002, 20041003],
                    "Time": [184531, 202316, 175015, 192822, 183314],
                    "VCD": [293.7, 305.4, 322.9, 316.6, 334.4]})

clw1 = frame1.drop_duplicates("Date")
clw1["Datetime"] = clw1["Date"].apply(lambda x: dt.datetime.strptime(str(x), "%Y%m%d"))
clw1["doye"] = clw1["Datetime"].apply(lambda x: int(dt.datetime.strftime(x,'%j')))

clw1输出是:

>>> clw1
       Date    Time    VCD             Datetime  doye
0  20041001  184531  293.7  2004-10-01 00:00:00   275
2  20041002  175015  322.9  2004-10-02 00:00:00   276
4  20041003  183314  334.4  2004-10-03 00:00:00   277

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM